Если по непонятным причинам 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