bash скрипт для автоматического перезапуска Apache - PullRequest
15 голосов
/ 30 января 2010

Я написал скрипт bash, чтобы перезапустить Apache, когда он завис, и отправить электронное письмо администратору. Код показан ниже. код перезапустит Apache, если номер процесса Apache равен нулю. Проблема в том, что Apache некоторое время зависает, а процессы все еще не равны нулю, поэтому в этом случае скрипт не перезапустит Apache. Необходимо: как я могу изменить код для перезапуска 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="me@mydomain.com"
# Email text/message
EMAILMESSAGE="apache auto restart done"
# send an email using /bin/mail
/bin/mail -s "$SUBJECT" "$EMAIL" "$EMAILMESSAGE"
fi

Ответы [ 4 ]

32 голосов
/ 30 января 2010

Раньше у нас был 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=yourself@example.com
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

Мы никогда не выясняли проблему ...

2 голосов
/ 30 января 2010

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

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

if ! pgrep apache2 -c >/dev/null; then
1 голос
/ 30 января 2010

Почему Apache зависает? Вы можете добраться до причины?

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

1 голос
/ 30 января 2010

Вы можете попытаться отправить http-запрос в apache (например, с помощью wget --timeout=10), и если этот запрос истечет или произойдет сбой (состояние выхода! = 0), вы убьете и перезапустите apache.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...