2010-01-30 4 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 restart или аналогичный ... – t0mm13b

+1

Привет. Джулиано, ты прав. Я ищу основную причину проблемы, но я думаю, что этот тип скриптов является «обязательным», потому что в будущем он может висеть, и этот скрипт будет временным решением проблемы. –

ответ

29

Мы использовали, чтобы Apache segfaulting иногда на машине; вот сценарий, который мы использовали, пытаясь отладить проблему при сохранении 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 или проверить состояние apache с помощью /etc/init.d/httpd status? Я думаю, что использование wget придаст большему стрессу сервер. – geckob

+2

Я бы рекомендовал использовать фактический http-запрос, потому что если Apache просто зависает или что-то блокирует (т. Е. Процесс все еще работает), сценарий инициализации не скажет вам. И если ваш сервер не может обрабатывать один запрос в минуту, сбой Apache является наименьшим из ваших забот;) – Thomas

1

Вы могли бы попытаться отправить запрос HTTP в Apache (например, с использованием wget --timeout=10) и если что время ожидания запроса или выходит из строя (состояние выхода! = 0), вы убьете и перезапустить Apache.

1

Почему Apache висит? Можете ли вы понять причину?

Существует множество сценариев и инструментов для демонстрации приложений и наблюдения за ними. Как вам кажется, на Debian или Ubuntu, посмотрите на пакеты daemon и daemontools. Я уверен, что есть и другие.

2

Может ли подсчет процесса действительно быть меньше нуля?

Этого должно быть достаточно:

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

Я не вижу, насколько это актуально, однако это правда. –

Смежные вопросы