获取服务器状态并发送到twitter

前两天,空间提供商kilu的服务器似乎有些问题,总是出现下线或者拒绝服务器的状态,于是想写一个脚本来自动获得服务器状态并公布到twitter上。在kilu的论坛上发现了一个帖子,并告诉了服务器状态的网址: http://subdomain.kilu.info/,但该地址获得的是所有服务器的状态,于是开了firebug,看了一下,原来后台向 http://m2000.onpw.de/kilu/server_check.php 发送的请求,格式如下:

http://m2000.onpw.de/kilu/server_check.php?srv=Server_Id&port=Port&tm=Num

Server_Id为你空间所在的服务器的id,kilu的服务器都是www1,www2,www3什么的,在后台管理可以看的到的(比如我的是12),port为要检查的端口号,tm这个可以不要的(应该是tm,昨天看的,没什么必要,所以就没记住)

于是写了个脚本来获得服务器信息:

       #!/bin/sh
Time=`curl "http://m2000.onpw.de/kilu/server_check.php?srv=12&port=80" | sed -e 's/<[^<]*>//g'`
Result=`echo $Time | grep "sec"`
WEB_ERROR=""
if [ -z "$Result" ] ; then
    WEB_ERROR="web failed:$Time"
    twitter.sh "通知:http://zeze0556.tk 可能下线,原因:$Time,造成该原因可能由于网络故障或维护,我们将在半个小时检测一次,并及时通知检测结果,本通知由脚本自动发送"
    echo "$WEB_ERROR" > web_error
else
    if [ -e web_error ] ; then
        rm -drf web_error
        twitter.sh "通知:http://zeze0556.tk 服务器恢复正常,本通知由脚本自动发送"
    else
        echo "success=$Time"
    fi
fi

Time=`curl "http://m2000.onpw.de/kilu/server_check.php?srv=12&port=3306" | sed -e 's/<[^<]*>//g'`
Result=`echo $Time | grep "sec"`
SQL_ERROR=""
if [ -z "$Result" ] ; then
    SQL_ERROR="SQL failed:$Time"
    twitter.sh "通知:http://zeze0556.tk 数据库异常变动,原因:$Time,造成该原因可能由于网络故障或维护,我们将在半个小时检测一次,并及时通知检测结果,本消息由脚本自动发送"
    echo "$SQL_ERROR" > sql_error
else
    if [ -e sql_error ] ; then
        rm -drf sql_error
        twitter.sh "通知:http://zeze0556.tk 数据库恢复正常,本通知由脚本自动发送"
    else
        echo "success=$Time"
    fi
fi
       

上述内容中,3306是sql数据库的端口号,之所以检查是因为wordpress需要从数据库中读取内容。

上述内容中,还有一个twitter.sh的脚本,这个脚本是用来将消息发送到twitter上的,网上很多教程关于从linux命令行发送twitter的,由于twitter现在不支持basic 认证了,不过所幸的是,通过GTAP还是可以进行basic认证的,而且更加的安全。于是就有了下面的内容:

       #!/bin/sh
curl -m 30 -u User:PASSWD -d status="$1" https://XXXX.appspot.com/statuses/update.xml
echo "$1"
       

上述内容中,User和PASSWD是你在GTAP上设置的用户名和密码,并非twitter的帐户名和密码,当然,如果你两个账户和密码完全相通的话,当我没说过。XXXX为你的GTAP的应用程序ID。

脚本server_info.sh检测思路是这样的,首先去获取80端口的服务器信息,检查返回的结果中是否有sec的字样,如果有的话,说明服务器服务正常,没有的话,则说明服务器出现问题了,最可能的是超时或者拒绝服务。失败的情况下将调用twitter.sh发送消息,并将错误信息写入web_error目录中,如果下次检查成功的话,则删除该文件,并发送服务器回复正常的通知。对于SQL的检查也是一样的逻辑,只是文件变成了sql_error了。将server_info.sh放到cron的执行任务中,半个小时执行一次,这样可以很方便的让用户获得服务器的当前状态了。如果能有免费的短信接口,那就更完美了。

发布者

rix

如果连自己都不爱自己,哪还有谁来爱你