В последнее время мой блог всегда закрывается, он использует 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.