原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://kerry.blog.51cto.com/172631/320349
         最近公司服务器所在机房常因攻击和网络故障导致网站无法正常访问,为了能第一时间获知网站无法访问,并快速处理问题,特利用shell脚本对服务器访问状况进行监控,一但网站无法访问即可触发短信报警,这里面参考了张晏和junnan的博文,在此表示感谢!!
 
         首先需要有一个已开通飞信的手机号,并把接收警报短信的手机号加为飞信好友(也可以自己给自己发),调用飞信的免费短信接口发送报警短信,也可使用MSN报警,相对短信报警更及时。
         编辑脚本http.sh
vi /opt/http.sh
 
#!/bin/sh
LANG=C
 
#被监控服务器、端口列表
server_all_list=(\
www.qq.com:80 \
www.163.com:80 \
www.sina.com:80 \
)
 
telnum=已开通飞信的手机号
passwd=飞信密码
 
date=$(date -d "today" +"%Y-%m-%d_%H:%M:%S")
#采用HTTP POST方式发送检测信息给接口程序interface.php,接口程序负责分析信息,决定是否发送报警MSN消息、手机短信、电子邮件。
send_msg_to_interface()
{
        if [[ $2 = "0" ]] || [[ $2 = "2" ]]; then
                #开始发送警报短信,13500000000是接收方手机号
                curl -m 600 -d username=${telnum} -d password=${passwd} -d sendto=13500000000 -d message=$1 
http://sms.api.bz/fetion.php
  echo "`date +'%Y-%m-%d %H:%M:%S'`      $1 ">> http_down.log
                #发送msn警报消息(如果不需要msn警报可以注释这行)
#               curl -m 600 -d menu=http -d date=$date -d ip=$server_ip -d port=$server_port -d status=$status
http://127.0.0.1/monitor/interface.php
        fi;
}
 
server_all_len=${#server_all_list[*]}
i=0
while  [ $i -lt $server_all_len ]
do
   server_ip=$(echo ${server_all_list[$i]} | awk -F ':' '{print $1}')
   server_port=$(echo ${server_all_list[$i]} | awk -F ':' '{print $2}')
   server_message=" "
   if curl -m 10 -G
http://${server_all_list[$i]}/ > /dev/null 2>&1
   then
     #status:    0,http down    1,http ok    2,http down but ping ok
     status=1
           echo "服务器${server_ip},端口${server_port}能够正常访问!";
                   server_message="服务器${server_ip},端口${server_port}能够正常访问!";
   else
       if curl -m 30 -G
http://${server_all_list[$i]}/ > /dev/null 2>&1
       then
           status=1
           echo "服务器${server_ip},端口${server_port}能够正常访问!"
                   server_message="服务器${server_ip},端口${server_port}能够正常访问!";
       else
           if ping -c 1 $server_ip > /dev/null 2>&1
           then
               status=2
               echo "服务器${server_ip},端口${server_port}无法访问,但是能够Ping通!";
                           server_message="服务器${server_ip},端口${server_port}无法访问,但是能够Ping通!";
           else
               status=0
               echo "服务器${server_ip},端口${server_port}无法访问,并且无法Ping通!";
                           server_message="服务器${server_ip},端口${server_port}无法访问,并且无法Ping通!";
           fi
       fi
   fi
 send_msg_to_interface "${server_message}" "${status}";
   let i++
done
 
interface.php (需要设置监控端服务器的让其可访问到,如:http://127.0.0.1/monitor/interface.php,与上面脚本对应)
这里需要一个PHP类
sendMsg,用来通过PHP发送消息到MSN,下载后把目录解压到interface.php目录即可。
 
include('sendmsg/sendMsg.php');
 
//HTTP服务器监控
if (isset($_POST["menu"]))
{
 if (htmlspecialchars($_POST["menu"]) == "http")  
 {  
  $date = htmlspecialchars($_POST["date"]);  
  $ip = htmlspecialchars($_POST["ip"]);
  $port = htmlspecialchars($_POST["port"]);
  $status = htmlspecialchars($_POST["status"]);//状态,0表示无法访问,1表示正常,2表示无法访问但能ping通
 
  $message = '';
  switch($status)
  {
   case '0':
    $message = $ip . '服务器无法访问';
    break;
   case '1':
    $message = $ip . '服务器工作正常';
    break;
   case '2':
    $message = $ip . '服务器无法访问但能ping通';
    break;
  }
 
  if ($status == 0 && $status == 1)
  {
   $sendMsg = new sendMsg();
   $sendMsg->login('用来发消息的MSN帐号', '密码');
   $sendMsg->createSession('用来接收消息的MSN帐号');
   $sendMsg->sendMessage(iconv("GBK", "UTF-8", $message), 'Times New Roman', 'FF0000');
 
  }
 }
}
 
然后执行crontab -e,加入如下语句:
 
*/5 * * * * sh /opt/http.sh
 
service crond restart
 
这样脚本将会每5分钟执行一次,如果检查到网站故障就会触发报警

        以上脚本运行了很长一段时间都很正常,也能第一时间了解服务器的down机情况,但最近发现不能报警了,飞信的短信接口不能调用了,无奈只能借助于139邮件报警,邮箱跟手机绑定
 
利用sendEmail发送报警邮件:
cd /opt
wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz
tar -zxvf sendEmail-v1.56.tar.gz
cd sendEmail-v1.56
cp sendEmail /usr/local/bin
chmod +x /usr/local/bin/sendEmail
#sendEmail使用方法
sendEmail -f 13512345678@139.com -t 13512345678@139.com -s smtp.139.com -u "from cacti" -xu 13512345678@139.com -xp 123456 -o message-charset=utf-8 -m “测试邮件发送”
#解释:-f 表示发送者的邮箱
     -t 表示接收者的邮箱
     -s 表示SMTP服务器的域名或者ip
     -u 表示邮件的主题
     -xu 表示SMTP验证的用户名
     -xp 表示SMTP验证的密码(注意,这个密码貌似有限制,例如我用d!5neyland就不能被正确识别)
     -m 表示邮件的内容如果你不带-m参数的话,就会提示你自行输入
     -o 文本信息字符集,如不加这一项,发送的中文信息就会变成乱码
 
把原脚本中的
 curl -m 600 -d username=${telnum} -d password=${passwd} -d sendto=13500000000 -d message=$1  http://sms.api.bz/fetion.php
 
修改为:
sendEmail -f 13512345678@139.com -t 13512345678@139.com -s smtp.139.com -u "from cacti" -xu 13512345678@139.com -xp 123456 -o message-charset=utf-8 -m $1
 
 
 
 

本文出自 “聆听未来” 博客,请务必保留此出处http://kerry.blog.51cto.com/172631/320349