<b>2.6.3 监控类脚本</b>
在生产环境下,服务器的稳定情况会直接影响公司的生意和信誉,可见其有多重要。所以,我们需要即时掌握服务器的状态,我们一般会在机房部署nagios-server作为监控程序,然后用shell和python根据业务需求开发监控插件,实时监控线上业务。
1. nginx负载均衡服务器上监控nginx进程的脚本
由于笔者公司电子商务业务网站前端的load balance用到了nginx+keepalived架构,而keepalived无法进行nginx服务的实时切换,所以设置了一个监控脚本nginx_pid.sh,每隔5秒钟就监控一次nginx的运行状态(也可以由superviored守护进程托管),如果发现有问题就关闭本机的keepalived程序,让vip切换到从nginx负载均衡器上。在对线上环境进行操作的时候,人为地重启主master的nginx机器,从nginx机器在很短的时间内就接管了vip地址,即网站的实际内网地址(此内网地址可以通过防火墙映射为公网ip),进一步证实了此脚本的有效性,脚本内容如下(此脚本在centos 5.8/6.4 x86_64下均已测试通过):
#!/bin/bash
while :
do
nginxpid=`ps -c nginx --no-header | wc -l`
if [ $nginxpid -eq 0 ];then
ulimit -shn 65535
/usr/local/nginx/sbin/nginx
sleep 5
if [ $nginxpid -eq 0 ];then
/etc/init.d/keepalived stop
fi
fi
sleep 5
done
2.系统文件打开数监测脚本
这个脚本比较方便,可用来查看nginx进程下最大文件打开数,脚本代码如下(此脚本在centos 5.8/6.4 x86_64、amazon linux ami x86_64下均已测试通过):
for pid in `ps
aux |grep nginx |grep -v grep|awk '{print $2}'`
cat
/proc/${pid}/limits | grep 'max open files'
脚本的运行结果如下所示:
max open
files 65535 65535 files
files 65535 65535 files
files 65535 65535 files
3.监测mysql主从复制是否同步
笔者有不少基于公网类型的网站(没有硬件防火墙,直接置于idc机房)采用的都是mysql主从架构,从机主要起备份数据库和冷备份的作用,虽然从机宕机了问题不大,但也会影响到数据的备份工作;这样的网站有数十个,如果逐个手动检查,每天都要花费不少时间,所以也用了脚本监控。
脚本设计思路:
1)此脚本应该能适应各种各样不同的内外网环境,即ip不同的环境。
2)让脚本顺便也监控下mysql是否正常运行。
3)slave机器的io和sql状态都必须为yes,缺一不可,这里用到了多重条件判断-a。
脚本内容如下所示(此脚本在centos 5.8 x86_64下已测试通过):
#check
mysql_slave status
#crontab time
00:10
mysqlport=`netstat
-na|grep "listen"|grep "3306"|awk -f[:" "]+
'{print $4}'`
mysqlip=`ifconfig
eth0|grep "inet addr" | awk -f[:" "]+ '{print $4}'`
status=$(/usr/local/webserver/mysql/bin/mysql
-u yuhongchun -pyuhongchun101 -s /tmp/mysql.sock -e "show slave
status\g" | grep -i "running")
io_env=`echo $status | grep io | awk ' {print $2}'`
sql_env=`echo
$status | grep sql | awk '{print $2}'`
if [
"$mysqlport" == "3306" ]
then
echo "mysql is running"
else
mail -s "warn!server: $mysqlip mysql
is down" [email protected]
fi
"$io_env" = "yes" -a "$sql_env" = "yes"
]
echo "slave is running!"
echo "####### $date
#########">> /data/data/check_mysql_slave.log
echo "slave is not running!"
>> /data/data/check_mysql_slave.log
mail -s "warn!
$mysqlip_replicate_error" [email protected] <<
/data/data/check_mysql_slave.log
建议每10分钟运行一次,脚本如下:
*/10 * * * *
root /bin/sh /root/mysql_slave.sh
要记得在每台mysql从机上分配一个yuhongchun的用户,权限大些也没关系,只限定在本地运行,脚本如下所示:
grant all
privileges on *.* to "yuhongchun"@"127.0.0.1" identified by
"yuhongchun101";
privileges on *.* to "yuhongchun"@"localhost" identified by
4.监控python程序是否正常运行
需求比较简单,主要是监控业务进程rsync_redis.py是否正常运行,有没有发生crash的情况。另外,建议将类似于rsync_redis.py的重要业务进程交由superviored守护进程托管。此脚本内容如下所示(此脚本在amazon linux ami x86_64下已测试通过):
sync_redis_status=`ps
aux | grep sync_redis.py | grep -v grep | wc -l `
${sync_redis_status} != 1 ]; then
echo "critical! sync_redis is
died"
exit 2
echo "ok! sync_redis is alive"
exit 0