使用 Supervisor 控制 tomcat

使用 Supervisor 控制 tomcat

通过主管控制时,有没有办法“优雅地”关闭 tomcat?

我的理解是 Tomcat 的 shutdown.sh 脚本与关闭端口上的 tomcat 对话以启动正常关闭。Supervisor 似乎没有办法指定关闭“命令”,只能使用信号。

有人成功使用过 Supervisor 和 tomcat 吗?

此外,由于 tomcat 的 startup.sh 脚本启动了 java 进程,我一直将生成的 java 命令直接复制到主管中,但由于所有环境设置,这并不像使用 startup.sh 脚本那么好。有没有办法让主管使用 startup.sh 脚本,但仍跟踪生成的子 java 进程?

答案1

感谢 Mark 提供该脚本的链接;这是我在 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`

以下是我在 /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

运行后是这样的:

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

我最初尝试通过指令将这些环境变量添加到 /etc/supervisord.conf 中environment,但遇到了 JAVA_OPTS 问题,因为里面全是空格和等号。将其放入包装器脚本中就可以解决这个问题。

希望这可以帮助别人节省一些时间!

答案2

catalina.sh 中有一个“运行”命令。它与 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

作为“catalina.sh run”运行的 tomcat 在前台运行,具有正确的 pid 并接受信号。与 supervisord 配合得很好。

答案3

主管似乎没有办法指定关闭“命令”,只能使用信号。

您是否尝试过使用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

相关内容