Cron shell script para reiniciar o Tomcat

2

Estou tendo alguns problemas com um servidor de aplicativos Tomcat. Antes que eu consiga corrigir o problema com o aplicativo Java, preciso criar um script shell cron para reiniciar o servidor.

Eu pensei que isso seria um esforço simples, mas a única complicação é que a causa raiz faz com que o Tomcat não seja encerrado de forma limpa após a execução de ./shutdown.sh. O processo ainda está aberto quando eu executo ps auwwx | grep java | grep org.apache.catalina.startup.Bootstrap

Eu mato o processo -9 (sim, isso é ruim, mas as coisas aparecem ok - até agora;)) e eu posso reiniciar o servidor corretamente.

Eu não sou especialista em shell script (ou novato) e preciso de ajuda com "polling" por um período de tempo até que o comando ps acima retorne null. Depois de um período de pesquisa, eu mataria e depois reiniciaria.

    
por spdaly 18.11.2009 / 22:11

5 respostas

1

Este é um resumo de um script que faria o que você deseja. Claro, você terá que dar um corpo e pode mudar o argumento para sleep (mostrado aqui como cinco segundos).

#!/bin/bash
while ps | grep | grep > /dev/null
do
    sleep 5
done
kill
restart

Você pode combinar os dois greps em um usando uma expressão regular, se necessário. Nota: quando você está fazendo esse tipo de coisa, às vezes você pode obter falsos positivos quando grep se encontra (embora seus dois greps evitem isso). Para evitar isso, você pode fazer grep [s]omething , que encontrará "... alguma coisa ..." mas não "grep alguma coisa" na saída de ps .

    
por 18.11.2009 / 23:23
0

O que você está fazendo é um patch para não lidar adequadamente com as exceções Java. Eu entendo querendo fazer as reinicializações, realmente, eu faço. Se este for um projeto de produção ou de longo prazo, o mundo será um lugar melhor se você simplesmente pegar e lidar com os erros.

(o Tomcat morre se algum erro fizer todo o caminho de volta até a pilha de chamadas.)

    
por 18.11.2009 / 23:34
0

Tivemos que resolver esse problema ao mesmo tempo em que desenvolvemos nosso servidor Tcat para suportar reinicializações confiáveis.

Você pode fazer o download do Tcat Server e dar uma olhada no tcat6.sh para ter ideias de como o resolvemos. Se você tiver perguntas específicas, sinta-se à vontade para postar aqui.

O servidor Tcat é na verdade 100% do Tomcat vanilla com recursos adicionais para configuração, implantação e diagnóstico - adoraria fazer o download e ver se ele atende às suas necessidades. Seu livre para usar no desenvolvimento e pode ser baixado de: link . Se você não quiser usar o console da web, poderá usar o curl para chamar a API REST do Tcat Server para fazer as reinicializações.

Espero que isso ajude.

Disclaimer: Eu trabalho para o MuleSoft e estou strongmente envolvido com o Tcat Server.

    
por 16.12.2009 / 18:48
0

Servidores de aplicativos como o Tomcat não gostam se os webapps se comportarem mal (fazendo coisas desagradáveis com carregadores de classes, vazamentos de memória, iniciando threads não pertencentes ao daemon, etc.) para que não possam ser desligados apropriadamente quando solicitados.

Em primeiro lugar, para reiniciar o Tomcat da maneira mais difícil, pode ser a coisa "certa" a ser feita para manter as operações em execução até que o aplicativo possa ser corrigido. A próxima coisa é aumentar o nível de log e checar os arquivos de log para pontos obious como OutOfMemoryErrors, etc. Se você tiver sorte, o webapp usa logging e pode apontar o que está fazendo.

A próxima coisa é anexar um agente de monitoramento (visualvm.dev.java.net está fazendo um ótimo trabalho) para a instância do Tomcat. Você precisa ativar o JMX no lado do servidor antes de poder se conectar remotamente. Se você estiver usando o Suse Linux ou semelhante, não se esqueça de configurar o nome do host rmi do servidor como propriedade do sistema. Assista ao consumo de memória, retire os encadeamentos quando os servidores travam. Quando você emite um pedido de desligamento com shutdown.sh e o servidor não desliga corretamente, faça um dump de encadeamento e veja quais encadeamentos estão sendo executados e em qual classe / método eles estão agora.

Se houver algo errado com a memória, você pode querer tentar ajustar as configurações do coletor de lixo para a JVM ou usar outra JVM como o JRockit. Usar um GC mais agressivo pode ajudar.

Outra maneira é impedir que o aplicativo faça o que fizer de errado - use um Gerenciador de Segurança e ajuste o arquivo de política de segurança até que o aplicativo esteja funcionando. Pode revelar que o aplicativo está fazendo algo que não deveria fazer em primeiro lugar.

    
por 16.12.2009 / 22:58
0

Verifique aqui: link

    
por 02.02.2010 / 11:59