Controllo di Tomcat con supervisore


14

Esiste un modo per arrestare "con grazia" Tomcat quando si controlla tramite supervisore?

La mia comprensione è che lo script shutdown.sh di Tomcat parla con Tomcat sulla porta di arresto per avviare un arresto regolare. Il supervisore non sembra avere un modo per specificare un "comando" di arresto, usando solo segnali.

Qualcuno ha usato con successo il supervisore con Tomcat?

Inoltre, poiché lo script startup.sh di tomcat avvia il processo java, sto copiando il comando java risultante direttamente nel supervisore, ma questo non è bello come usare lo script startup.sh a causa di tutte le impostazioni dell'ambiente. C'è un modo per ottenere il supervisore per utilizzare lo script startup.sh ma tenere traccia del processo java figlio risultante?

Risposte:


6

Grazie a Mark per il link a quello script; ecco il mio esempio di lavoro per 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`

Ed ecco cosa ho usato in /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

In esecuzione, sembra così:

[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

Inizialmente ho provato ad aggiungere quelle variabili d'ambiente in /etc/supervisord.conf attraverso la environmentdirettiva, ma ho avuto problemi con JAVA_OPTS, con tutti gli spazi e segni di uguale. Metterlo nello script wrapper si è occupato di questo.

Spero che questo aiuti a salvare qualcun altro un po 'di tempo!


1
Posso confermare che questo funziona con Tomcat 7 in Supervord v3.0 su CentOS 6. Si noti che startalla fine del comando in /etc/supervisord.conf è un argomento non necessario poiché lo script non fa nulla con esso.
Rick Hanlon II,

Ah, grazie per la cattura! Lo passavo a catalina.sh. L'ho rimosso.
Aaron R.

20

C'è un comando "run" in catalina.sh. Funziona perfettamente con il supervisore:

[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

Tomcat funziona come "catalina.sh run" funziona in primo piano, ha il pid corretto e accetta i segnali. Funziona perfettamente con supervisord.


1
Questa dovrebbe essere una risposta accettata.
MaratC,

Ottengo "Impossibile avviare il server. L'istanza del server non è configurata"
xtian il

0

Il supervisore non sembra avere un modo per specificare un "comando" di arresto, usando solo segnali.

Hai provato ad usare 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

sembra che QUIT induca tomcat a eseguire il dump del thread nel registro catalina.out (ovvero console).
Segna il

1
Questo è un suggerimento interessante: confluence.atlassian.com/plugins/viewsource/… - Avvolgi essenzialmente catalina.sh in uno script e installa una funzione trap per l'arresto ...
Segna

@Mark questo è per launchd su OSX, come può essere adattato per supervisore?
Conrad.Dean,

1
@ Il supervisore Conrad.Dean usa gli stessi presupposti. Lo stesso script funziona per il supervisore senza modifiche
Mark
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.