Как написать скрипт оболочки, перезапускающий Apache, если `сервер достиг MaxClients`

Как написать скрипт оболочки, перезапускающий Apache, если `сервер достиг MaxClients`

В последнее время мой блог всегда закрывается, он использует centos6.2+apache2.2+mysql5.5+php5.3. Я поднял MaxClientsв httpd.conf, но менее полезно.

Так возможно ли написать скрипт оболочки (запускать с помощью crontab каждые 10 минут), чтобы прочитать httpd/error_log, если последнее сообщение preg_match sending a SIGTERMавтоматически перезапустит Apache?

решение1

Разбор файлов журнала может быть довольно сложным. Вместо того, чтобы пытаться сделать это, вам, вероятно, лучше использовать скрипт, например, такой, который может запускаться из записи crontab. Этот скрипт попытается получить доступ к серверу, если это не удастся, то он перезапустит Apache.

Сценарий

Источник сценария:bash-скрипт для автоматического перезапуска Apache

#!/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

Пути

Пути к скриптам остановки/запуска необходимо будет скорректировать в соответствии с тем, где ваш дистрибутив установил Apache. Строки вроде этой:

        /etc/init.d/apache2 start >> $THEDIR/mail 2>&1

Если у вас CentOS, то будет так:

        /etc/init.d/httpd start >> $THEDIR/mail 2>&1

Имя исполняемого файла

То же самое и со killlallстроками. Имя исполняемого файла на CentOS — httpd.

Запись в crontab

Этот cron необходимо запустить от имени пользователя root, чтобы у него были соответствующие разрешения на остановку/запуск Apache.

Связанный контент