Controlando o tomcat com supervisor

14

Existe uma maneira de "graciosamente" desligar o tomcat ao controlar via supervisor?

Meu entendimento é o script shutdown.sh do Tomcat que fala com o tomcat na porta shutdown para iniciar um desligamento normal. O supervisor não parece ter uma maneira de especificar um "comando" de desligamento, apenas usando sinais.

Alguém usou com sucesso o supervisor com o tomcat?

Além disso, desde que o script startup.sh do tomcat inicia o processo java, copio o comando java resultante diretamente no supervisor, mas isso não é tão bom quanto usar o script startup.sh por causa de toda a configuração do ambiente. Existe uma maneira de obter o supervisor para usar o script startup.sh, mas ainda acompanhar o processo java filho resultante?

Marca
fonte

Respostas:

6

Obrigado a Mark pelo link para esse script; Aqui está o meu exemplo de trabalho para o CentOS:

#!/bin/bash
# Source: https://confluence.atlassian.com/plugins/viewsource/viewpagesrc.action?pageId=252348917
function shutdown()
{
    date
    echo "Shutting down Tomcat"
    unset CATALINA_PID # Necessary in some cases
    unset LD_LIBRARY_PATH # Necessary in some cases
    unset JAVA_OPTS # Necessary in some cases

    $TOMCAT_HOME/bin/catalina.sh stop
}

date
echo "Starting Tomcat"
export CATALINA_PID=/tmp/$$
export JAVA_HOME=/usr/local/java
export LD_LIBRARY_PATH=/usr/local/apr/lib
export JAVA_OPTS="-Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.password.file=/etc/tomcat.jmx.pwd -Dcom.sun.management.jmxremote.access.file=/etc/tomcat.jmxremote.access -Dcom.sun.management.jmxremote.ssl=false -Xms128m -Xmx3072m -XX:MaxPermSize=256m"

# Uncomment to increase Tomcat's maximum heap allocation
# export JAVA_OPTS=-Xmx512M $JAVA_OPTS

. $TOMCAT_HOME/bin/catalina.sh start

# Allow any signal which would kill a process to stop Tomcat
trap shutdown HUP INT QUIT ABRT KILL ALRM TERM TSTP

echo "Waiting for `cat $CATALINA_PID`"
wait `cat $CATALINA_PID`

E aqui está o que eu usei no /etc/supervisord.conf:

[program:tomcat]
directory=/usr/local/tomcat
command=/usr/local/tomcat/bin/supervisord_wrapper.sh
stdout_logfile=syslog
stderr_logfile=syslog
user=apache

Em execução, fica assim:

[[email protected]:~]# supervisorctl start tomcat
tomcat: started
[[email protected]:~]# supervisorctl status
tomcat                           RUNNING    pid 9611, uptime 0:00:03
[[email protected]:~]# ps -ef|grep t[o]mcat
apache    9611  9581  0 13:09 ?        00:00:00 /bin/bash /usr/local/tomcat/bin/supervisord_wrapper.sh start
apache    9623  9611 99 13:09 ?        00:00:10 /usr/local/java/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.password.file=/etc/tomcat.jmx.pwd -Dcom.sun.management.jmxremote.access.file=/etc/tomcat.jmxremote.access -Dcom.sun.management.jmxremote.ssl=false -Xms128m -Xmx3072m -XX:MaxPermSize=256m -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/tomcat/endorsed -classpath /usr/local/tomcat/bin/bootstrap.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start

Inicialmente, tentei adicionar essas variáveis ​​de ambiente ao /etc/supervisord.conf através da environmentdiretiva, mas tive problemas com o JAVA_OPTS, com todos os espaços e sinais de igual. Colocá-lo no script wrapper cuidou disso.

Espero que isso ajude a salvar alguém mais algum tempo!

Aaron R.
fonte
1
Posso confirmar que isso funciona com o Tomcat 7 no supervisord v3.0 no CentOS 6. Observe que startno final do comando no /etc/supervisord.conf é um argumento desnecessário, pois o script não faz nada com ele.
Rick Hanlon II
Hah, obrigado pela captura! Eu costumava passar isso para catalina.sh. Eu o removi.
Aaron R.
20

Existe um comando "run" no catalina.sh. Funciona perfeitamente bem com o supervisor:

[program:tomcat]
command=/path/to/tomcat/bin/catalina.sh run
process_name=%(program_name)s
startsecs=5
stopsignal=INT
user=tomcat
redirect_stderr=true
stdout_logfile=/var/log/tomcat.log

O tomcat run como "catalina.sh run" funciona em primeiro plano, possui o pid correto e aceita sinais. Funciona perfeitamente bem com supervisord.

Sergey Kozlov
fonte
1
Esta deve ser uma resposta aceita.
MaratC
Eu recebo "Não é possível iniciar o servidor. A instância do servidor não está configurada"
xtian
0

O supervisor não parece ter uma maneira de especificar um "comando" de desligamento, apenas usando sinais.

Você já tentou usar stopsignal=QUIT?

[program:tomcat]
command=java ...
process_name=tomcat
priority=150
startsecs=10
directory=./
stopsignal=QUIT
stdout_logfile=./logs/tomcat.log
stderr_logfile=./logs/tomcat.err
quanta
fonte
parece que QUIT faz com que o tomcat faça um despejo de encadeamento no log catalina.out (também conhecido como console).
Mark
1
Esta é uma sugestão interessante: confluence.atlassian.com/plugins/viewsource/... - Essencialmente embrulhar catalina.sh em um script e instalar uma função armadilha para desligamento ...
Mark
@ Mark isto é para launchd no OSX, como ele pode ser adaptado para supervisor?
Conrad.Dean
1
O supervisor do @ Conrad.Dean usa as mesmas suposições. O mesmo script funciona para supervisor sem modificações
Mark