<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