Enseñame - Estudiantes colectivos

Ciclos Formativos Grado Superior (CFGS) => ASIR/ASIX - Administración de Sistemas informáticos en Red => Informática => M01 - Implantación de sistemas operativos => Mensaje iniciado por: Rubén Arroyo en Enero 04, 2016, 12:01:51 pm

Título: Script de auto reinicio de Apache 2
Publicado por: Rubén Arroyo en Enero 04, 2016, 12:01:51 pm
FUENTE: http://foro.arrayzone.com/index.php?topic=621 (http://foro.arrayzone.com/index.php?topic=621)

Tengo 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 código
Código: Bash
  1. #!/bin/bash
  2. # Autor: Ruben Arroyo
  3. # http://arrayzone.com
  4. # Script que auto reinicia el servicio "apache2" si cae por MaxLimitClients o alguna causa similar
  5. # SOLO REINICIA APACHE2
  6. #
  7. # REQUISITOS:
  8. # curl
  9. #
  10. # Se recomienda ponerlo en un cron cada 5 minutos
  11. # crontab -e
  12. # */5 * * * * bash /root/autoreboot/script.sh
  13.  
  14. #######################
  15. # CONFIGURACION
  16. #######################
  17. # Email de aviso a (si se deja vacio no se enviara ningun email)
  18. ADMIN_EMAIL="admin@arrayzone.com"
  19.  
  20. # Comando que ejecutaremos para reiniciar apache
  21. #COMANDO_REINICIO="sudo service apache2 restart"
  22. COMANDO_REINICIO="service apache2 restart"
  23.  
  24. # Fichero de LOG del apache para extraer la informacion
  25. FICHERO_LOG="/var/log/apache2/error.log"
  26.  
  27. # comprobamos si apache funciona (con un limite de 3 segundos de espera)
  28. curl http://localhost -m 3 -s > /dev/null
  29.  
  30. # Si no ha cargado la web local...
  31. if [ $? -ne 0 ]
  32. then
  33.         # Preparamos el mensaje de log (que ttambien enviaremos por email)
  34.         mensaje="$(date) reiniciando apache"
  35.         mensaje+="LOG:================\n"
  36.  
  37.         # Cargamos las ultimas 50 lineas del log del apache (no pone saltos de linea actualmente)
  38.         # Habria que hacer un bucle para sacar los saltos de linea
  39.         mensaje+=$(tail -50 ${FICHERO_LOG} | sed 's/\\n/\n/g')
  40.  
  41.         # Reiniciamos el apache y guardamos el log
  42.         mensaje+="\n"
  43.         mensaje+="$(${COMANDO_REINICIO})"
  44.         mensaje+="\n"
  45.  
  46.         echo -e ${mensaje} >> apacheReboot.log
  47.         echo "##########################" >> apacheReboot.log
  48.  
  49.  
  50.         # Enviamos el email al administrador
  51.         echo -e $mensaje | mail -s "Reinicio Apache" ${ADMIN_EMAIL}
  52. #else
  53. #       PRUEBAS DE QUE FUNCIONA (no es recomendado dejarlo funcionando en produccion)
  54. #       echo "$(date) todo va bien" >> apacheReboot.log
  55. #       echo "##########################" >> apacheReboot.log
  56. fi

Ponerlo en funcionamiento
NOTA:  Recomiendo hacerlo todo desde el usuario root
Para que funcione, tenemos que guardarlo en un archivo (por ejemplo /root/autoreboot/script.sh)
Después ejecutamos:
Código: Bash
  1. chmod +x /root/autoreboot/script.sh
  2. crontab -e
  3.  

Esto nos ejecutará el gestor de crons, dentro pegamos:
Código: Bash
  1.  */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ódigo
Bueno, 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

Código: Bash
  1. #Ultimas lineas que se revisaran para ver si ha caido el servicio
  2. #No pongas un numero muy grande si no se escriben casi lineas, con 5 deberian haber suficientes
  3. LINEAS_EXAMINAR=5
  4. #
  5. #Trozo de texto que usaremos en el grep (no hace falta poner una linea entera, solo algo que sea reconozible)
  6. TEXTO_A_BUSCAR=""
  7. #Ejecutamos el comando de prueba
  8. tail -${LINEAS_EXAMINAR} ${FICHERO_LOG} | grep "${TEXTO_A_BUSCAR}" > /dev/null
  9.  



Cualquier código de mejora o ayuda será bien recibida.

¡Espero que os sirva!
Título: Re:Script de auto reinicio de Apache 2
Publicado por: Rubén Arroyo en Abril 26, 2016, 04:56:38 pm
Un compañero del foro (peatonet (http://ensena.me/index.php?action=profile;u=66)) me ha pasado un enlace (me hubiese ido muy bien cuándo hice el script, pero encontré otros tropecientos que no funcionaban), básicamente modificaríamos la forma de comprobar (el resto del script vendría a ser igual).

Fuente: http://www.linuxhispano.net/2013/02/19/monitorizar-servidor-web-para-ver-si-esta-caido-o-no-de-forma-automatica/

Código: Bash
  1. #!/bin/bash
  2. url="aquí_tu_url";
  3. response=$(curl -s -I -L $url | grep HTTP);
  4.  
  5. status=${response#* };
  6. status=${status:0:3};
  7.  
  8. if [ "$status" != "200" ]
  9. then
  10.     // acciones a efectuar
  11. fi