shell 练习(13) —— 监控 httpd 进程数是否异常
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=0for i in $(seq 1 5);do/usr/local/apache2/bin/apachectl restart 2>/tmp/apache.errif [ $? -ne 0 ];thenn=$[$n + 1]elsebreakfidoneif [ $n -eq 5 ];then#用發郵件的腳本發送郵件給管理員python mail.py "123@qq.com" "httpd service restart failed" "httpd process restart faild."exitfi }while true: dot_n=$(pgrep -l httpd | wc -l)if [ $t_n -ge 500 ];then/usr/local/apache2/bin/apachectl restart 2>/tmp/apache.errif [ $? -ne 0 ];thencheck_servicefisleep 60s_n=$(pgrep -l httpd | wc -l)if [ $s_n -ge 500 ];thenpython mail.py "123@qq.com" "httpd service has some wrong" "httpd process number is budy"exitfifisleep 10 done4. 解釋
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 來代替,作用一樣。
轉載于:https://blog.51cto.com/hellocjq/2330516
總結
以上是生活随笔為你收集整理的shell 练习(13) —— 监控 httpd 进程数是否异常的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 去除移动端点击效果
- 下一篇: 多级菜单栏展开隐藏动画