Recentemente, meu blog sempre fechou, ele usa arquivos centos6.2+apache2.2+mysql5.5+php5.3
. Eu criei MaxClients
em httpd.conf
, mas menos útil.
Então é possível escrever um script de shell (executar com crontab a cada 10 minutos), para ler o httpd/error_log
, se a última mensagem preg_match
sending a SIGTERM
reiniciar o apache automaticamente?
Responder1
Analisar os arquivos de log pode ser bastante complicado. Em vez de tentar fazer isso, provavelmente seria melhor usar um script como este, que pode ser executado a partir de uma entrada do crontab. Este script tentará acessar o servidor; se não tiver sucesso, reiniciará o Apache.
Roteiro
Fonte do roteiro:script bash para reiniciar o Apache automaticamente
#!/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
Caminhos
Os caminhos para os scripts de parada/inicialização precisarão ser ajustados de acordo com o local onde sua distribuição instalou o Apache. Linhas como esta:
/etc/init.d/apache2 start >> $THEDIR/mail 2>&1
Se você estiver no CentOS será assim:
/etc/init.d/httpd start >> $THEDIR/mail 2>&1
Nome do executável
O mesmo acontece com as killlall
linhas. O nome do executável no CentOS é httpd
.
A entrada do crontab
Este cron precisará ser executado como root para que tenha as permissões apropriadas para parar/iniciar o Apache.