在某些64位的Linux系統中,Apache進程可能存在內存泄露、CPU死鎖等情況,導致httpd或php5-cgi進程佔用100%的CPU,並且無法自動釋放。這個腳本將直接監控Apache/網站/HTTP服務的可用性,並且根據情況自動採取不同的操作,如強行自動重啓Apache、在重啓Apache依然無法解決的情況下自動重啓服務器等等。
完整腳本如下。如需複製,請使用右側浮動工具欄的“複製”按鈕。
06 | URL= "http://127.0.0.1/" |
09 | curl --connect-timeout 15 --max- time 20 -- head --silent "$URL" | grep '200' |
16 | top -n 1 -b >> /var/log/apachemonitor.log |
17 | /usr/bin/killall -9 apache2 && /usr/bin/killall -9 php5-cgi && /usr/bin/killall -9 httpd && /usr/bin/killall -9 http && /usr/bin/killall -9 apache && /usr/bin/killall -9 php-cgi > /dev/null |
19 | /etc/init.d/apache2 start > /dev/null |
20 | /etc/init.d/httpd start > /dev/null |
21 | echo $( date ) "Apache Restart" >> /var/log/apachemonitor.log |
24 | echo $( date ) "Failed! Now Reboot Computer!" >> /var/log/apachemonitor.log |
功能解釋:
腳本將在啓動後等待5分鐘(防止腳本已經啓動了,但Apache還沒啓動完畢,造成誤判),然後每隔10秒,對本地http://127.0.0.1進行測試,如果正常返回200代碼,則不進行任何操作;如果超過15秒仍然沒有響應,或相應錯誤代碼,則:
1、將top命令所得結果保存至 /var/log/apachemonitor.log 文件,用於分析故障原因;
2、無條件kill掉所有的apache/apache2/httpd/http/php-cgi/php5-cgi進程,不管是否存在;
3、啓動Apache(爲了兼容性考慮,同時嘗試啓動/etc/init.d/下的httpd與apache2)
4、記錄Apache Restart 與當前時間至 /var/log/apachemonitor.log 日誌中;
5、等待30S,如果網站正常訪問了,則不進行任何操作,開始下個循環檢測;如果訪問仍然不正常,則將“Failed”寫入日誌,並執行reboot重啓Linux。
使用方法:
將此腳本加入到rc.local自動啓動即可。
本腳本使用了curl來獲取網站狀態,因此需要預先在Linux中安裝好curl(一般都有)。
優缺點:
如果Apache本身出嚴重錯誤了,可能導致服務器不停重啓(當然你可以把重啓的那行刪掉)
採用curl直接獲取HTTP狀態碼,而不是監控內部進程,因此準確權威,能反映網站的實際狀態。