collapse

0 Usuarios y 1 Visitante están viendo este tema.

*

Desconectado Rubén Arroyo

  • *****
  • 24
  • +2/-0
  • Sexo: Masculino
    • Ver Perfil
    • Mi blog
Script de auto reinicio de Apache 2
« en: Enero 04, 2016, 12:01:51 pm »
FUENTE: 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 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
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!
« Última modificación: Enero 04, 2016, 12:17:35 pm por Rubén Arroyo »
Administrador de ensena.me

Visita también: Mi blog personal - ArrayZone.com - Web para desarroladores de software

*

Desconectado Rubén Arroyo

  • *****
  • 24
  • +2/-0
  • Sexo: Masculino
    • Ver Perfil
    • Mi blog
Re:Script de auto reinicio de Apache 2
« Respuesta #1 en: Abril 26, 2016, 04:56:38 pm »
Un compañero del foro (peatonet) 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
Administrador de ensena.me

Visita también: Mi blog personal - ArrayZone.com - Web para desarroladores de software

 

* Servicios de Enseña.me

* Calendar

Diciembre 2017
Dom Lun Mar Mié Jue Vie Sáb
1 2
3 4 5 6 7 8 9
10 [11] 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

No se encontraron eventos en el calendario.

* Sponsor

This domain is courtesy of .ME
Dominio por cortesía de .ME
Domini per cortesía de .ME