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=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 來代替,作用一樣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章