1. 題目
在服務器上,寫一個監控腳本,要求如下:
1)每隔 10s 去檢測一次服務器上的 httpd 進程數,如果大於等於 500 的時候,就需要自動重啓一次 apache 服務,並且檢測啓動是否成功。
2)若沒有正常啓動還需再一次啓動,最大不成功數超過5次則需立即發送郵件通知管理員,並且以後不再檢測!
3)如果啓動成功後,1分鐘後再次檢測 httpd 進程數,若正常則重複之前操作(每隔 10s 檢測一次),若還是大於等於 500,那放棄重啓並需要發送郵件給管理員,然後自動退出該腳本。假設其中發送郵件的腳本是mail.py。
2. 分析
1)每隔 10s 檢測一次,用死循環 while 實現;
2)檢測 httpd 進程數,用 pgrep -l httpd | wc -l 統計;如果大於等於 500 則重啓用 /usr/local/apache2/bin/apachectl restart 。
3)重啓是否成功,可以用 pgrep 再統計一次進程數,或者用 echo $? 是否爲 0 判斷。如果確認重啓成功則 1 分鐘後再重新統計 pgrep 數。如果重啓不成功,則至多再檢測 5 次,5次之後仍然重啓失敗,則放棄檢測。
4) 發郵件時,可以寫上郵件題目和內容。
3. 腳本
#!/bin/bash
# 重複檢測 apache 是否重啓成功的函數:
check_service()
{
n=0
for i in $(seq 1 5);do
/usr/local/apache2/bin/apachectl restart 2>/tmp/apache.err
if [ $? -ne 0 ];then
n=$[$n + 1]
else
break
fi
done
if [ $n -eq 5 ];then
#用發郵件的腳本發送郵件給管理員
python mail.py "[email protected]" "httpd service restart failed" "httpd process restart faild."
exit
fi
}
while true:
do
t_n=$(pgrep -l httpd | wc -l)
if [ $t_n -ge 500 ];then
/usr/local/apache2/bin/apachectl restart 2>/tmp/apache.err
if [ $? -ne 0 ];then
check_service
fi
sleep 60
s_n=$(pgrep -l httpd | wc -l)
if [ $s_n -ge 500 ];then
python mail.py "[email protected]" "httpd service has some wrong" "httpd process number is budy"
exit
fi
fi
sleep 10
done
4. 解釋
1)連續重啓 5 次 apache 服務的腳本,單獨放在 check_service() 函數。利用變量 n 來計數,每重啓失敗一次,n+1,哪怕有一次成功都會被 break 終止 for 循環跳出。如果最後 for 循環累加了 5 次,就發送郵件,並且通過 exit 退出腳本。
2)如果 apache 第1次就重啓成功,或者通過 check_service 在5次之內重啓成功,腳本都會等待60s 後,再進行檢測。注意看腳本中的判斷順序。
3)腳本中除了用 pgrep -l httpd 來統計 httpd 進程數以外,還可以用 ps -C httpd --no-heading 來代替,作用一樣。