2010-01-30 118 views
12

我寫了一個bash腳本來重啓Apache,當它掛起併發送郵件給管理員。代碼如下所示。如果Apache進程的數量爲零,代碼將重新啓動Apache。問題是:Apache有時會掛起,進程仍然不是零,所以在這種情況下,腳本不會重新啓動Apache。 需要的是:如何修改代碼以重啓Apache,如果它掛起並且進程不爲零。bash腳本自動重啓Apache

#!/bin/bash 
if [ `pgrep apache2 -c` -le "0" ]; then 
/etc/init.d/apache2 stop 
pkill -u www-data 
/etc/init.d/apache2 start 
echo "restarting....." 
SUBJECT="Apache auto restart" 
# Email To ? 
EMAIL="[email protected]" 
# Email text/message 
EMAILMESSAGE="apache auto restart done" 
# send an email using /bin/mail 
/bin/mail -s "$SUBJECT" "$EMAIL" "$EMAILMESSAGE" 
fi 
+7

修復疾病,沒有症狀。你應該問如何確定爲什麼Apache掛起(可能在ServerFault中),然後修復它......而不是如何在掛起時重新啓動它。 – Juliano

+0

爲什麼在這裏重新發明輪子,在/etc/rc.d或類似的(取決於unix/linux安裝)中找到的啓動腳本有能力重啓,但是再次檢查錯誤日誌,必須重新啓動服務器,通常是/etc/rc.d/3/rc.httpd重啓或類似... – t0mm13b

+1

嗨。朱利亞諾你是對的。我在尋找問題的根源,但我認爲這種腳本是「必須擁有」的腳本,因爲將來它有可能會掛起,這個腳本將暫時解決問題。 –

回答

29

我們曾經有阿帕奇有時段錯誤的機器上;這裏是我們在保持Apache運行的同時試圖調試問題的腳本。它每分鐘左右從cron(以root身份)運行一次。它應該是不言自明的。

#!/bin/sh 
# Script that checks whether apache is still up, and if not: 
# - e-mail the last bit of log files 
# - kick some life back into it 
# -- Thomas, 20050606 

PATH=/bin:/usr/bin 
THEDIR=/tmp/apache-watchdog 
[email protected] 
mkdir -p $THEDIR 

if (wget --timeout=30 -q -P $THEDIR http://localhost/robots.txt) 
then 
    # we are up 
    touch ~/.apache-was-up 
else 
    # down! but if it was down already, don't keep spamming 
    if [[ -f ~/.apache-was-up ]] 
    then 
     # write a nice e-mail 
     echo -n "apache crashed at " > $THEDIR/mail 
     date >> $THEDIR/mail 
     echo >> $THEDIR/mail 
     echo "Access log:" >> $THEDIR/mail 
     tail -n 30 /var/log/apache2_access/current >> $THEDIR/mail 
     echo >> $THEDIR/mail 
     echo "Error log:" >> $THEDIR/mail 
     tail -n 30 /var/log/apache2_error/current >> $THEDIR/mail 
     echo >> $THEDIR/mail 
     # kick apache 
     echo "Now kicking apache..." >> $THEDIR/mail 
     /etc/init.d/apache2 stop >> $THEDIR/mail 2>&1 
     killall -9 apache2 >> $THEDIR/mail 2>&1 
     /etc/init.d/apache2 start >> $THEDIR/mail 2>&1 
     # send the mail 
     echo >> $THEDIR/mail 
     echo "Good luck troubleshooting!" >> $THEDIR/mail 
     mail -s "apache-watchdog: apache crashed" $EMAIL < $THEDIR/mail 
     rm ~/.apache-was-up 
    fi 
fi 

rm -rf $THEDIR 

我們也沒搞清楚這個問題...

+7

'rm -rf'讓我緊張。看起來你正在寫兩個文件。只是明確地刪除它們,然後'rmdir $ THEDIR'。 –

+0

哪一個更好地測試Apache服務器,使用wget或使用/etc/init.d/httpd狀態檢查Apache的狀態?我想使用wget會給服務器帶來更多的壓力。 – geckob

+2

我肯定會推薦使用一個實際的http請求,因爲如果Apache只是掛起死鎖或某些東西(即進程仍在運行),init腳本不會告訴你。如果你的服務器每分鐘不能處理一個請求,崩潰的Apache是​​你最擔心的; – Thomas

1

你可以嘗試發送一個HTTP請求到apache的(例如使用wget --timeout=10),如果出該請求倍或失敗(退出狀態!= 0),你殺和重新啓動Apache。

1

爲什麼Apache會掛起?你能找到原因嗎?

有很多腳本和工具可以「守護」應用程序並監視它們。由於您似乎在Debian或Ubuntu上,請查看包daemondaemontools。我相信也有其他人。

2

過程的計數是否真的小於零?

這應該是足夠了:

if ! pgrep apache2 -c >/dev/null; then 
+1

我不明白這是如何相關的,但它可能是真實的。 –