Reinicie se o serviço tomcat7 não estiver respondendo

3

Estou executando um aplicativo da web em um servidor Tomcat. Há um problema difícil de detectar no código do servidor que faz com que ele trave uma ou duas vezes todos os dias. Vou cavar para corrigir quando tiver tempo. Mas até aquele dia, em um caso problemático, reiniciar o tomcat (/etc/init.d/tomcat7 restart) ou basicamente reiniciar a máquina também parece ser uma boa solução por agora. Eu quero detectar a vivacidade do servidor com o wget em vez de grep ou outra coisa, porque mesmo que o tomcat esteja executando o meu serviço, eu estou com problemas.

wget localhost:8080/MyService/

saídas

--2012-12-04 14:10:20--  http://localhost:8080/MyService/
Resolving localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:8080... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2777 (2.7K) [text/html]
Saving to: “index.html.3”

100%[======================================>] 2,777       --.-K/s   in 0s

2012-12-04 14:10:20 (223 MB/s) - “index.html.3” saved [2777/2777]

quando meu serviço está funcionando. E saídas

Resolving localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:8080... failed: Connection refused.

ou apenas stucks depois de dizer

--2012-12-04 14:07:34--  http://localhost:8080/MyService/
Resolving localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:8080... connected.
HTTP request sent, awaiting response...

Você pode me oferecer um script de shell com um cron job ou outra coisa para fazer isso? Eu prefiro não usar o cron se houver uma alternativa.

    
por Bahadir Ismail Aydin 04.12.2012 / 15:28

3 respostas

1

Em vez de criar scripts do zero, recomendo usar Monit . Eu encontrei esta página que lhe dá algumas noções básicas, mas eu acho a implementação aqui é um pouco desleixada. Então deixe-me resolver isso. Isso explicará como definir monit no Ubuntu 12.04. Primeiro, instale monit do repositório da seguinte forma:

sudo aptitude install monit

Em seguida, você deseja ajustar as configurações do servidor de e-mail para receber alertas por e-mail. Basta abrir o monit config assim:

sudo nano /etc/monit/monitrc

Agora, procure a área com as configurações do servidor de e-mail e insira esta linha:

set mailserver localhost

Este é o conjunto de regras que eu uso para o Apache. Primeiro, crie o arquivo de configuração:

sudo nano /etc/monit/conf.d/apache2.conf

check process apache with pidfile /var/run/apache2.pid
        start "/etc/init.d/apache2 start"
        stop  "/etc/init.d/apache2 stop"
        if failed host 127.0.0.1 port 80
                with timeout 15 seconds
        then restart
        if loadavg (1min) greater than 7
                for 5 cycles
        then restart
        alert [email protected] only on { timeout, nonexist, resource }

Em seguida, reinicie monit da seguinte forma:

sudo service monit restart

Esse conjunto de regras verifica a porta 80 no endereço do host local de 127.0.0.1 e, se houver um tempo limite de 15 segundos, o serviço Apache é reiniciado. Eu também tenho uma regra de média de carga conectada a ele que verificará a carga a cada minuto e se estiver acima de 7 por 5 ciclos consecutivos, ela reiniciará o serviço apache .

Para o Tomcat, adaptar a regra nesta página - como mencionado acima, ficaria assim. Primeiro abra um arquivo para edição no diretório monit config assim:

/etc/monit.d/tomcat 

E coloque este conjunto de regras nele:

check host tomcat with address localhost
            stop program = "/etc/init.d/tomcat stop"
            start program = "/etc/init.d/tomcat restart"
            if failed port 8080 and protocol http
            then start
            alert [email protected] only on { start, nonexist }

Em seguida, reinicie monit , assim, para essas novas regras:

sudo service monit restart

Eu verificaria novamente o { start, nonexist } , como estou supondo agora, pois não tenho uma configuração do Tomcat para testar. Mas isso deve ser bom.

Você pode seguir o monit log aqui:

sudo tail -f -n 200 /var/log/monit.log
    
por 29.04.2014 / 04:03
0

Espero que você já tenha encontrado a causa raiz do problema e consiga corrigi-lo corretamente. Caso você ou alguém precise de uma solução para isso, aqui está uma tentativa de resposta.

A coisa aqui é que seu serviço pode às vezes 'travar', e o monitoramento também deve ser capaz de alcançá-lo. No script simples abaixo, colocamos a consulta de status do wget em segundo plano, esperamos alguns segundos e, se ela não conseguiu recuperar o status 200 do serviço, reinicie-a.

#!/bin/sh
# WARNING, UNTESTED CODE !

TMPFILE='mktemp'
WAITTIME=15

# Run the test
wget localhost:8080/MyService/ -o $TMPFILE &
WGETPID=$!

# Wait few seconds and let the test finish
sleep $WAITTIME

if [ ! 'grep "HTTP request sent" $TMPFILE |grep "200 OK"|wc -l' -gt 0 ]; then
    echo "The service did not return 200 in $WAITTIME seconds."
    echo "Restarting it."
    /etc/init.d/tomcat7 restart
fi

# Cleanup
rm $TMPFILE
kill $WGETPID

Para o agendamento, eu realmente recomendo o cron para simplificar. Outra opção seria começar isso como um daemon, que introduziria complexidade desnecessária, IMHO. Além disso, algum outro agendador (externo) poderia ser usado, mas eu mantenho o cron mais simples.

Espero que isso ajude.

    
por 14.01.2013 / 07:09
0

Monit é uma boa ferramenta para isso. Ele irá acompanhar serviços ou o status do servidor, como Tomcat (ou disco rígido espaço etc) e ele vai reiniciar-los, envie um e-mail etc acordo com o que você coloca em um arquivo de configuração, sendo mais poderoso e flexível do que um script Bash (que você pode preferir para simplificar).

    
por 30.03.2014 / 01:23