FUENTE:
http://foro.arrayzone.com/index.php?topic=621Tengo que decir antes de nada, que creo que el módulo al que más pega el script es a este dada la complejidad.
Dado que nuestro servidor no incluye ninguna herramienta contra caídas, tuvimos que hacer de forma casera un pequeño script que, cada
5 minutos revisase el estado del
apache2 y lo reiniciase de forma automática si había caído, además de avisarno por email.
Antes de llegar a esta solución, intentamos probar otra pero que no nos convenció (pondremos el trozo de código al final por si a alguien le sirve)
¿Que hace el script?Básicamente revisa cada 5 minutos que el apache funcione haciendo una petición.
¿Esta completo?Aún no, faltan algunas cosas (pero no son importantes):
- El email que envia con el log no le pone los saltos de linea, estamos intentando buscar una solucion sin tener que usar un bucle de forma manual
El código#!/bin/bash
# Autor: Ruben Arroyo
# http://arrayzone.com
# Script que auto reinicia el servicio "apache2" si cae por MaxLimitClients o alguna causa similar
# SOLO REINICIA APACHE2
#
# REQUISITOS:
# curl
#
# Se recomienda ponerlo en un cron cada 5 minutos
# crontab -e
# */5 * * * * bash /root/autoreboot/script.sh
#######################
# CONFIGURACION
#######################
# Email de aviso a (si se deja vacio no se enviara ningun email)
ADMIN_EMAIL="admin@arrayzone.com"
# Comando que ejecutaremos para reiniciar apache
#COMANDO_REINICIO="sudo service apache2 restart"
COMANDO_REINICIO="service apache2 restart"
# Fichero de LOG del apache para extraer la informacion
FICHERO_LOG="/var/log/apache2/error.log"
# comprobamos si apache funciona (con un limite de 3 segundos de espera)
curl http://localhost -m 3 -s > /dev/null
# Si no ha cargado la web local...
if [ $? -ne 0 ]
then
# Preparamos el mensaje de log (que ttambien enviaremos por email)
mensaje="$(date) reiniciando apache"
mensaje+="LOG:================\n"
# Cargamos las ultimas 50 lineas del log del apache (no pone saltos de linea actualmente)
# Habria que hacer un bucle para sacar los saltos de linea
mensaje+=$(tail -50 ${FICHERO_LOG} | sed 's/\\n/\n/g')
# Reiniciamos el apache y guardamos el log
mensaje+="\n"
mensaje+="$(${COMANDO_REINICIO})"
mensaje+="\n"
echo -e ${mensaje} >> apacheReboot.log
echo "##########################" >> apacheReboot.log
# Enviamos el email al administrador
echo -e $mensaje | mail -s "Reinicio Apache" ${ADMIN_EMAIL}
#else
# PRUEBAS DE QUE FUNCIONA (no es recomendado dejarlo funcionando en produccion)
# echo "$(date) todo va bien" >> apacheReboot.log
# echo "##########################" >> apacheReboot.log
fi
Ponerlo en funcionamientoNOTA: Recomiendo hacerlo todo desde el usuario
rootPara que funcione, tenemos que guardarlo en un archivo (por ejemplo
/root/autoreboot/script.sh)
Después ejecutamos:
chmod +x /root/autoreboot/script.sh
crontab -e
Esto nos ejecutará el gestor de
crons, dentro pegamos:
*/5 * * * * bash /root/autoreboot/script.sh
Donde 5 son los minutos que pasarán entre comprobación y comprobación.
Finalmente pulsamos
Control + x y confirmamos el guardado pulsando
s (o
y) y
Enter.
El primer códigoBueno, realmente no fué exactamente el primero... pero nos hacemos una idea, esto puede ser útil para algunos casos (básicamente es reemplazar la linea de
curl por éste (haciendo los cambios necesarios, no va a funcionra tal cual), seguramente también debas modificar el
if#Ultimas lineas que se revisaran para ver si ha caido el servicio
#No pongas un numero muy grande si no se escriben casi lineas, con 5 deberian haber suficientes
LINEAS_EXAMINAR=5
#
#Trozo de texto que usaremos en el grep (no hace falta poner una linea entera, solo algo que sea reconozible)
TEXTO_A_BUSCAR=""
#Ejecutamos el comando de prueba
tail -${LINEAS_EXAMINAR} ${FICHERO_LOG} | grep "${TEXTO_A_BUSCAR}" > /dev/null
Cualquier código de mejora o ayuda será bien recibida.
¡Espero que os sirva!