[SOLUCIONADO] Ayuda con código Bash - Reiniciar servidor de Tomcat

  • 3 Respuestas
  • 1472 Vistas

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

Desconectado H4R4K1R1

  • *
  • Underc0der
  • Mensajes: 42
  • Actividad:
    0%
  • Reputación 1
    • Ver Perfil
Buenos días compañ[email protected] de Underc0de,

Os comento mi situación...

Recientemente se me ha pedido la siguiente tarea:

- Tenemos un servidor de TOMCAT que a veces se cae por distintos procesos...
- La forma de detectarlo es mediante un comando "curl -v http://url" que te da una respuesta si está bien, si no lo está, te da otra distinta...
- Si la respuesta no es esa, el servidor debe de levantarse nuevamente...

La idea es, hacer un script que levante ese servidor cuando el status sea distinto de X... Poniendo por ejemplo, que si se detecta que la respuesta es durante 5 segundos distinta, se levante nuevamente..

No tengo mucha idea de como podría hacer ese código... Agradecería enormemente si alguien pudiese guiarme con algún ejemplo para ello.

He sido incapaz de encontrar otro código que poder reutilizar, y de cero no sabría hacerlo...

Mil gracias compañeros :)
« Última modificación: Enero 17, 2019, 08:59:26 am por HATI »

Desconectado Solid Water

  • *
  • Underc0der
  • Mensajes: 146
  • Actividad:
    3.33%
  • Country: 00
  • Reputación 6
  • (:{
    • Ver Perfil
Por lo que dices creo que estas en linux.
Casi todos los linux traen perl instalado.
Solo abres el nano o el vim y creas un script como este con extension .pl
para ejecutarlo utilizas el comando perl nombre_de_archivo.pl

Código: (perl) [Seleccionar]
#!/usr/bin/perl

use strict;

my $respuesta = qx("curl -v http://url");

while($respuesta ne "cadena de salida certera"){

     system("comando que levanta el server");
     my $respuesta = qx("curl -v http://url");
}

exit;

Hay otra forma de guardar la salida del comando en lugar de qx que si no me equivoco es utilizando estas comillas ´´.
Me gustaría darte más información pero no tengo mi web online donde tengo mis códigos.
Si no te gusta que sea tan forzoso y ejecute el comando mil veces solo cambia el while por un if, y programalo para que se ejecute cada 1 o 2 minutos.

También por si la salida no es siempre la misma pero es parecida, puedes utilizar expresiones regulares para saber si la cadena de resultado contiene X palabra.

Saludos,
« Última modificación: Enero 10, 2019, 04:42:05 pm por Solid Water »

Conectado DtxdF

  • *
  • Moderator
  • Mensajes: 871
  • Actividad:
    100%
  • Country: 00
  • Reputación 17
  • Eres un auto y tienes dos opciones: Parar o Seguir
    • Ver Perfil
    • Mi repositorio de Github donde encontraras herramientas para tu trabajo.
    • Email
@H4R4K1R1

Recomendaciones antes de seguir leyendo:

- como estas corto de tiempo (supongo), tienes que aprender lo más básico de python
- crear un archivo bash con las instrucciones o comandos para encender el servidor nuevamente
- aprender lo más básico de la librería urllib, time, os y thread en python

Ahora:

Crearemos un script en python usando la librería urllib, time, os y thread, donde primero crearemos una función donde contendrá un bucle que se actualizará cada 1 segundo (aunque depende también de como lo coloques), donde verificará en ese periodo de tiempo el código de la respuesta http usando urllib (urllib.urlopen("http://url").code), generalmente la respuesta normal sería 200 si es diferente entonces que ejecute el archivo bash donde contendrá las instrucciones y por último con thread ejecutamos la función en un hilo independiente (thread no es necesario pero puedes optar por el en caso de que quieras agregar más funciones).
Los seres humanos son robots, cuyo combustible es el afanado dinero.

Desconectado H4R4K1R1

  • *
  • Underc0der
  • Mensajes: 42
  • Actividad:
    0%
  • Reputación 1
    • Ver Perfil
Primero que nada,

Mil gracias a @Solid Water y a @DtxdF por las respuestas :)

Pude ponerle solución a esto investigando poco a poco las dudas que me iban surgiendo, aquí dejo parte de la solución:

Código: (bash) [Seleccionar]
webserv="http://server1"
webserv2="http://server2"
keyword="X" #el mensaje que tiene que dar
NUMFALLOS=`cat /tmp/contadorErrores.txt`
curl1=$(curl -s --max-time 5 ${webserv} | grep -c "${keyword}")
curl2=$(curl -s --max-time 5 ${webserv2} | grep -c "${keyword}"
)
exec >>/var/log/webserv-status.log 2>&1 #Escribe en un log todos los "echo" que salgan.

fecha=$(date +"%y-%m-%d %H:%M")
echo $fecha
echo ${webserv}
echo "El 1 indica que el servidor esta corriendo / El 0 indica lo contrario"
echo "El estado del server1 es el siguiente: " ${curl1}
echo "El estado del server2 es el siguiente: "${curl2}
echo "El numero de fallos es: ${NUMFALLOS}"
if [[ ${curl1} -gt 0 ]] && [[ ${curl2} -gt 0 ]]
        then
        echo "$fecha :   -   La URL $webserv funciona como se esperaba"
            NUMFALLOS=$(( ${NUMFALLOS}*0 ))
            echo $NUMFALLOS >/tmp/contadorErrores.txt
        else
            NUMFALLOS=$(( ${NUMFALLOS}+1 ))
            echo $NUMFALLOS >/tmp/contadorErrores.txt
        fi

        if [ $NUMFALLOS == 3 ]
        then
        /etc/init.d/tomcat55 restart
        echo"$fecha :   -   Error: Se procedera a reiniciar el servidor de Tomcat."
NUMFALLOS=$(( ${NUMFALLOS}*0 ))
echo $NUMFALLOS >/tmp/contadorErrores.txt

fi