2010-01-30 33 views
12

Escribí un script bash para reiniciar Apache cuando se colgó y enviar un correo electrónico al administrador. El código se muestra a continuación. el código reiniciará Apache si el número de procesos de Apache es cero. El problema es que Apache se cuelga un poco y los procesos aún no son cero, por lo que en este caso el script no reiniciará Apache. Lo que se necesita es: ¿cómo modifico el código para reiniciar Apache si se colgó y los procesos no son cero?secuencia de comandos bash para reiniciar Apache automáticamente

#!/bin/bash 
if [ `pgrep apache2 -c` -le "0" ]; then 
/etc/init.d/apache2 stop 
pkill -u www-data 
/etc/init.d/apache2 start 
echo "restarting....." 
SUBJECT="Apache auto restart" 
# Email To ? 
EMAIL="[email protected]" 
# Email text/message 
EMAILMESSAGE="apache auto restart done" 
# send an email using /bin/mail 
/bin/mail -s "$SUBJECT" "$EMAIL" "$EMAILMESSAGE" 
fi 
+7

Fijar la enfermedad, no los síntomas. Deberías preguntarte cómo determinar por qué apache se cuelga (probablemente en ServerFault) y luego arreglarlo ... no cómo reiniciarlo cuando se cuelga. – Juliano

+0

¿Por qué reinventó la rueda aquí, las secuencias de comandos de inicio que se encuentran en /etc/rc.d o similar (dependiendo de la instalación de Unix/Linux) tienen la capacidad de reiniciarse, pero luego, revise los registros de errores para saber por qué tiene que reiniciar el servidor, generalmente /etc/rc.d/3/rc.httpd restart o similar ... – t0mm13b

+1

Hola. Juliano, tienes razón. Estoy buscando la causa raíz del problema, pero creo que este tipo de scripts es "imprescindible" porque es posible que en el futuro se bloquee y este script resuelva temporalmente el problema. –

Respuesta

29

Solíamos tener en violación de segmento veces Apache en una máquina; Aquí está el script que usamos para tratar de resolver el problema mientras mantuvimos activo a Apache. Funcionó desde cron (como root) una vez cada minuto más o menos. Debe ser autoexplicativo.

#!/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 

Nunca pudimos averiguar el problema ...

+7

Ese 'rm -rf' me pone nervioso. Parece que estás escribiendo dos archivos. Simplemente elimínelos explícitamente y luego 'rmdir $ THEDIR'. –

+0

¿Cuál es mejor para probar el servidor apache, usando wget o verificando el estado de apache usando el estado /etc/init.d/httpd? Estoy pensando que usar wget pondrá más estrés en el servidor. – geckob

+2

Sin duda, recomendaría utilizar una solicitud http real, porque si Apache simplemente cuelga bloqueos o algo así (es decir, el proceso aún se está ejecutando), el script de inicio no le dirá nada. Y si su servidor no puede manejar una solicitud por minuto, un apache que se cuelgue es la menor de sus preocupaciones;) – Thomas

1

Usted podría intentar enviar una solicitud HTTP Apache (por ejemplo, utilizando wget --timeout=10) y si esa petición el tiempo de espera o falla (estado de salida! = 0), que matar y reiniciar Apache.

1

¿Por qué apache? ¿Puedes llegar a la causa?

Hay una serie de scripts y herramientas para 'daemonizar' las aplicaciones y vigilarlas. Como parece que está en Debian o Ubuntu, eche un vistazo a los paquetes daemon y daemontools. Estoy seguro de que hay otros también.

2

¿Puede el conteo de un proceso ser realmente menor que cero?

Esto debería ser suficiente:

if ! pgrep apache2 -c >/dev/null; then 
+1

No veo cómo esto es relevante, por verdadero que sea. –

Cuestiones relacionadas