当通过pipe理员控制时,有没有办法“优雅地”closurestomcat?
我的理解是Tomcat的shutdown.sh脚本与closures端口上的tomcat对话以启动正常closures。 主pipe似乎没有办法指定closures“命令”,只使用信号。
有没有人成功地使用tomcat的主pipe?
另外,由于tomcat的startup.sh脚本启动了java进程,我一直在直接将生成的java命令复制到pipe理程序中,但是由于所有的环境设置,这不如使用startup.sh脚本。 有没有办法让主pipe使用startup.sh脚本,但仍然跟踪由此产生的子Java过程?
感谢马克的链接到该脚本; 这里是我为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
我最初尝试通过environment指令将这些环境variables添加到/etc/supervisord.conf中,但遇到了JAVA_OPTS的问题,并带有所有空格和等号。 把它放在包装脚本中照顾了这一点。
希望这有助于拯救别人一些时间!
catalina.sh中有一个“运行”命令。 与主pipe合作很好:
[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作为“catalina.sh run”运行在前台运行,具有正确的pid并接受信号。 与supervisord完美合作。
主pipe似乎没有办法指定closures“命令”,只使用信号。
你试过使用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