Простой скрипт автоматического рестарта http сервера

Если по непонятным причинам web сервер повисает, а времени на разбирательства нет, то неплохим вре́менным решением будет автоматический перезапуск web сервера. Такая ситуация сложилась с одним проектом у знакомого, администратор которого накануне уехал в отпуск. Вот скрипт который отлично справился с задачей.

Скрипт звать watchdog-httpd.sh

#!/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

PIDFILE=/root/1-watchdog/watchdog-http.pid
LOGFILE=/var/log/watchdog-httpd.log

  pid_httpd=`netstat -nlpt | grep 80 | grep httpd | awk '{print $7}' | awk -F/ '{print $1}'`

    if [ -f $PIDFILE ]; then
        echo "`date +%d-%m-%Y`  `date +%H:%M:%S%t` Previous script doesn't end. Exiting." >> $LOGFILE
        exit 1
    fi
    echo $$ > $PIDFILE

    if [ -z $pid_httpd ] 
    then
        echo "`date +%d-%m-%Y`  `date +%H:%M:%S%t` httpd not loaded. restarting" >> $LOGFILE
        /usr/sbin/apachectl -k restart
        rm $PIDFILE
        exit
    else
        web_response=`curl --connect-timeout 10 --max-time 30 -s -L --head -w "%{http_code}\n" http://youngblog.hoster-ok.com | tail -n1`
        if [ "$web_response" -ne "200" ]
        then
            echo "`date +%d-%m-%Y`  `date +%H:%M:%S%t` http pid:$pid_httpd not response. restarting" >> $LOGFILE
            apachectl -k restart
            rm $PIDFILE
            exit
        fi
    fi
    echo "`date +%d-%m-%Y`  `date +%H:%M:%S%t` httpd pid:$pid_httpd - response:[$web_response]" >> $LOGFILE
    rm $PIDFILE

Во время работы он тестирует что http сервер сидит на 80-м порту и затем проверяет доступность странички по адресу http://youngblog.hoster-ok.com
При этом он до 10-ти секунд ждёт соединения с сервером и ещё 30 секунд ждёт ответ сервера и код 200.
Свои действия он записывает в лог файл

/var/log/watchdog-httpd.log

в котором видно когда была перезагрузка сервера

26-07-2013  12:01:01     httpd pid:1861 - response:[200]
26-07-2013  12:02:32     http pid:1861 not response. restarting
26-07-2013  12:03:03     httpd pid:1861 - response:[200]

Обратите внимание что используетс рестарт сервера при котором не меняется его PID.

Запускается скрипт ежеминутно в cron от пользователя root

# crontab -lu root
MAILTO=""
# minutes, hours, day, month, weekday
# 0-59     0-23   1-31 1-12   0-6  0-sunday
*/1 * * * *  /root/1-watchdog/watchdog-httpd.sh &>/dev/null

Скрипт не допускает двойного запуска когда предудущий не завершился. Но при указанных параметрах таймаутов это не должно возникнуть так как 30+10=40 секунд в худшем случае. А запускается он каждые 60 секунд. Имеем запас в 20 секунд. Поэтому проверка завершения предыдущего запуска скорее дополнительная защита от многократных рестартов сервера.

Если скрипт будет прерван то останется маркерный PID файл тогда его нужно удалить ручками.

Знаете как редактировать крон? Я люблю пользоваться mcedit поэтому запускаю так:

# EDITOR=mcedit crontab -eu root