最近公司服务器所在机房常因***和网络故障导致网站无法正常访问,为了能第一时间获知网站无法访问,并快速处理问题,特利用shell脚本对服务器访问状况进行监控,一但网站无法访问即可触发短信报警。
首先需要有一个已开通飞信的手机号,并把接收警报短信的手机号加为飞信好友(也可以自己给自己发),调用 发送报警短信,也可使用MSN报警,相对短信报警更及时。
编辑脚本http.sh
vi /opt/http.sh
#!/bin/sh LANG=C
#被监控服务器、端口列表 server_all_list=(\ \ \ \ )
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 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 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 > /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 > /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类 ,用来通过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分钟执行一次,如果检查到网站故障就会触发报警