Contrôler Tomcat avec un superviseur

14

Existe-t-il un moyen d'arrêter "gracieusement" Tomcat lors du contrôle via le superviseur?

Ma compréhension est que le script shutdown.sh de Tomcat parle à tomcat sur le port d'arrêt pour lancer un arrêt normal. Le superviseur ne semble pas avoir un moyen de spécifier une "commande" d'arrêt, uniquement en utilisant des signaux.

Quelqu'un at-il utilisé avec succès le superviseur avec tomcat?

De plus, depuis que le script startup.sh de tomcat lance le processus java, j'ai copié la commande java résultante directement dans le superviseur, mais ce n'est pas aussi agréable que d'utiliser le script startup.sh en raison de toute la configuration de l'environnement. Existe-t-il un moyen pour que le superviseur utilise le script startup.sh tout en suivant le processus java enfant résultant?

marque
la source

Réponses:

6

Merci à Mark pour le lien vers ce script; voici mon exemple de travail pour 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`

Et voici ce que j'ai utilisé dans /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

En cours d'exécution, cela ressemble à ceci:

[[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

J'ai essayé initialement d'ajouter ces variables d'environnement dans /etc/supervisord.conf via la environmentdirective, mais j'ai rencontré des problèmes avec JAVA_OPTS, avec tous les espaces et les signes égaux. Le mettre dans le script wrapper s'est occupé de cela.

J'espère que cela aidera quelqu'un d'autre à gagner du temps

Aaron R.
la source
1
Je peux confirmer que cela fonctionne avec Tomcat 7 dans supervisord v3.0 sur CentOS 6. Notez qu'à startla fin de la commande dans /etc/supervisord.conf est un argument inutile car le script ne fait rien avec.
Rick Hanlon II
Hah, merci pour la capture! Je transmettais cela à catalina.sh. Je l'ai retiré.
Aaron R.
20

Il y a une commande "run" dans catalina.sh. Cela fonctionne parfaitement avec le superviseur:

[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

Le tomcat exécuté comme "catalina.sh run" fonctionne au premier plan, a le pid correct et accepte les signaux. Fonctionne parfaitement bien avec supervord.

Sergey Kozlov
la source
1
Cela devrait être une réponse acceptée.
MaratC
J'obtiens
0

Le superviseur ne semble pas avoir un moyen de spécifier une "commande" d'arrêt, uniquement en utilisant des signaux.

Avez-vous essayé d'utiliser 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
la source
il semble que QUIT oblige tomcat à effectuer un vidage de thread dans le journal catalina.out (aka console).
Mark
1
Ceci est une suggestion intéressante: confluence.atlassian.com/plugins/viewsource/… - Enveloppez essentiellement catalina.sh dans un script et installez une fonction d'
Mark
@Mark c'est pour launchd sur OSX, comment peut-il être adapté pour le superviseur?
Conrad.Dean
1
@ Le superviseur Conrad.Dean utilise les mêmes hypothèses. Le même script fonctionne pour le superviseur sans aucune modification
Mark