Problema
O problema com o script padrão de desligamento do Tomcat é que ele simplesmente não é suficientemente difícil. Quando você estiver usando os scripts de serviço da sua distro para parar o Tomcat, você simplesmente estará chamando o próprio script de desligamento do Tomcat. O CentOS não é diferente a esse respeito. Por esse motivo, você precisa estar familiarizado com o que o script de desligamento do Tomcat pode fazer por você e, mais importante, o que ele não faz : ele não garante realmente que o Tomcat morra. Longe disso.
A coisa é que é muito fácil para o Tomcat entrar em algum tipo de situação onde ele não pode ser eliminado através de sua porta de gerenciamento .. ou mesmo através de um sinal TERM
.
Vamos rever como o Tomcat pode ser eliminado por ordem de escalonamento:
-
Matando o Tomcat por meio de sua porta de gerenciamento. Este é o padrão e é isso que o script de desligamento do Tomcat tenta primeiro. Não funcionará se o processo Java for interrompido por um motivo ou outro. Todos os relatórios que você vê na Internet, onde as pessoas reclamam que o Tomcat não irá parar, estão mais ou menos sempre neste beco. Isso não é realmente culpa do Tomcat. É muito fácil criar um aplicativo da web que faça com que todo o contêiner fique suspenso ou impossível parar por meio desse método.
-
Matando o Tomcat enviando ao processo Java um sinal
TERM
. Essa é uma maneira mais strong de eliminar o Tomcat do que em (1) e o próprio script de encerramento do Tomcat tentará isso, mas será ativado apenas se você tiver definido a variávelCATALINA_PID
no seu Tomcatsetenv.sh
. (o que é altamente recomendável em qualquer caso). Matar um processo Unix / Linux enviando um sinalTERM
é o padrão para o comandokill
do sistema operacional. É a maneira educada de dizer um processo Unix / Linux para morrer. Infelizmente, mesmo isso, em raras ocasiões, não mata o processo do Tomcat. -
Matando o Tomcat enviando ao processo Java um sinal
KILL
. (da linha de comando do SO isso seriakill -9 <pid>
). Isto irá sempre matar o processo e deve ser o último recurso. O problema aqui é que o script padrão de encerramento do Tomcat nunca tentará isso, mesmo se o método (1) e (2) falharem. Então, se você realmente quer ter certeza de que o Tomcat foi morto, então você não tem escolha a não ser implementar seu próprio script de wrapper em torno do script de desligamento do próprio Tomcat.
Se estiver executando o Tomcat em um ambiente de produção, você realmente precisa considerar se pode viver com uma situação em que o Tomcat não morra (ou não é reiniciado) quando você executa, por exemplo, %código%. Você pode estar fazendo isso via cron e nesse caso você com certeza vai esperar um resultado determinístico, certo?
Recomendações
-
Sempre use um arquivo Tomcat
service tomcat restart
no qual você definesetenv.sh
. Isso pelo menos lhe dará o método 2 acima.CATALINA_PID
do Tomcat arquivo não existe por padrão, então você deve criá-lo você mesmo. -
Crie um script de wrapper em torno dos próprios scripts do Tomcat que garante que o Tomcat realmente morre.
No local onde trabalho, implementamos isso em todos os hosts que executam o Tomcat como um serviço. É o mesmo problema / solução para qualquer variante do Unix / Linux.