Control de tomcat con supervisor


14

¿Hay alguna manera de apagar "con gracia" Tomcat cuando se controla a través de un supervisor?

Entiendo que el script shutdown.sh de Tomcat habla con tomcat en el puerto de apagado para iniciar un apagado correcto. El supervisor no parece tener una manera de especificar un "comando" de apagado, solo usando señales.

¿Alguien ha utilizado con éxito supervisor con tomcat?

Además, dado que el script startup.sh de tomcat inicia el proceso java, he estado copiando el comando java resultante directamente en el supervisor, pero esto no es tan bueno como usar el script startup.sh debido a toda la configuración del entorno. ¿Hay alguna manera de hacer que el supervisor use el script startup.sh pero aún rastree el proceso java secundario resultante?

Respuestas:


6

Gracias a Mark por el enlace a ese script; Aquí está mi ejemplo de trabajo para 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`

Y esto es lo que usé en /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

Corriendo, se ve así:

[root@qa1.qa:~]# supervisorctl start tomcat
tomcat: started
[root@qa1.qa:~]# supervisorctl status
tomcat                           RUNNING    pid 9611, uptime 0:00:03
[root@qa1.qa:~]# 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 intenté agregar esas variables de entorno en /etc/supervisord.conf a través de la environmentdirectiva, pero tuve problemas con JAVA_OPTS, con todos los espacios y signos de igual. Ponerlo en el script de envoltura se encargó de eso.

¡Espero que esto ayude a salvar a alguien más algún tiempo!


1
Puedo confirmar que esto funciona con Tomcat 7 en supervisord v3.0 en CentOS 6. Tenga starten cuenta que al final del comando en /etc/supervisord.conf es un argumento innecesario ya que el script no hace nada con él.
Rick Hanlon II

Ja, gracias por la captura! Solía ​​pasar eso a catalina.sh. Lo he quitado
Aaron R.

20

Hay un comando "ejecutar" en catalina.sh. Funciona perfectamente bien con el 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

La ejecución de tomcat como "catalina.sh run" funciona en primer plano, tiene el pid correcto y acepta señales. Funciona perfectamente bien con el supervisor.


1
Esta debería ser una respuesta aceptada.
MaratC


0

El supervisor no parece tener una manera de especificar un "comando" de apagado, solo usando señales.

¿Has intentado 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

parece que QUIT hace que tomcat realice un volcado de subprocesos en el registro catalina.out (también conocido como consola).
Mark

1
Esta es una sugerencia interesante: confluence.atlassian.com/plugins/viewsource/… - Esencialmente envuelva catalina.sh en un script e instale una función de captura para el apagado ...
Marque el

@ Mark, esto es para el lanzamiento en OSX, ¿cómo se puede adaptar para el supervisor?
Conrad

1
@ Conrad. El supervisor decano usa los mismos supuestos. El mismo guión funciona para el supervisor sin modificaciones
Mark
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.