正常情况下,会优先采用catalina.sh stop来停止Tomcat实例,这样可以让服务有机会处理完请求,并做好善后工作。 但如果通过catalina.sh stop命令无法关闭Tomcat实例,则只能kill -9了。
为什么在给Tomcat发出stop命令以后,Tomcat实例无法关闭?
可能有两种原因:
Tomcat的主线程没有结束(也即main函数没有执行结束);
Tomcat中启动的webapps有非daemon线程阻止了Tomcat进程的关闭;
第一种情况,如果发出stop命令以后,Tomcat主线程并没有结束,自然通过它启动的webapps也是无法关闭的。虽然可以确信Tomcat不可能有这个问题,但还是拉出Tomcat的关闭过程代码看看:
publicvoidstart(){
if(getServer()==null){
load();
}
if(getServer()==null){
log.fatal("Cannot start server. Server instance is not configured.");
return;
}
longt1 =System.nanoTime();
// Start the new server
try{
getServer().start();
}catch(LifecycleExceptione){
log.fatal(sm.getString("catali