Recientemente, mi blog siempre se cierra, usa centos6.2+apache2.2+mysql5.5+php5.3
. He subido MaxClients
en httpd.conf
, pero menos útil.
Entonces, ¿es posible escribir un script de shell (ejecutar con crontab cada 10 minutos) para leer el archivo httpd/error_log
, si el último mensaje preg_match
sending a SIGTERM
reinicia Apache automáticamente?
Respuesta1
Analizar los archivos de registro puede ser bastante complicado. En lugar de intentar hacer eso, probablemente sería mejor usar un script como este que puede ejecutarse desde una entrada de crontab. Este script intentará acceder al servidor; si no tiene éxito, reiniciará Apache.
Guion
Fuente del guión:script bash para reiniciar Apache automáticamente
#!/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
Caminos
Las rutas a los scripts de parada/inicio deberán ajustarse en consecuencia según dónde haya instalado Apache su distribución. Líneas como esta:
/etc/init.d/apache2 start >> $THEDIR/mail 2>&1
Si estás en CentOS será así:
/etc/init.d/httpd start >> $THEDIR/mail 2>&1
Nombre del ejecutable
Lo mismo ocurre con las killlall
líneas. El nombre del ejecutable en CentOS es httpd
.
La entrada crontab
Este cron deberá ejecutarse como root para que tenga los permisos adecuados para detener/iniciar Apache.