tomcat两次关闭才能关掉

当前做多个系统的集成部署,目前是在本地的虚拟机上做实验,有一个问题就是:
使用toomcat部署war包,启动正常,关闭tomcat的时候直接报错了:
image.png
上网查了一下,大概原因可能是 因为java程序里面用了线程池的代码 导致系统不能马上关闭
image.png

然后再试了一下shutdown.sh命令就成功了 不过还是报了一个错
image.png

搜了一下网上的答案 大概就是更改catalina.sh的代码

在异常判断的时候直接 kill -force
image.png
可能是环境还是版本的不同我这边是没有找到对应的代码

强行加了一个 -forece后 也是报错了 脚本都中断 了

所以就在catalina.sh的脚本里自己加了一段" kill -9"

image.png

然后就是这种情况了:
image.png

最后总结
不作任何修改的话第一次关闭(./shutdown.sh)会报错,报错信息:tomcat.pid这个文件没有删除,再执行一次./shutdown.sh 会成功 不过报错信息一大片 大概就是命令执行失败,强行关闭了进程,这时候去看进程的文件也被删除了.

请问大家有什么好的方案

优雅的关闭tomcat

参考tomcat关闭失败解决方案

阅读 3.7k
1 个回答

“优雅的关闭tomcat”……默认的关闭脚本(不加force的),就已经是优雅的方案了,Tomcat 可以收到ShutdownHook,然后依次调用各个WebApp的ServletContextListener.contextDestroyed,比如你的Spring -> ServletContextListener,然后关闭 Spring Context,Spring 再 destroy 各个 Bean,比如你的连接池,你的连接池收到 destroy 后再依次关闭各个连接,多么优雅

tomcat 默认的关闭超时是 5秒,你的程序在5秒内没有成功关闭,所以你还是应该从代码下手,找找为什么关不了的原因,强制关闭当然会有报错

可能的原因有:

  1. 你线程池里的线程有死循环,并且没有关闭方式
  2. 你线程池里的线程代码没有处理中断(Interrupted)状态而且死循环
  3. 你线程池里的线程代码超过5秒才处理中断
  4. ……

而且,“优雅关闭”一般指的是平滑关闭,及不强制中断已有代码,比如在网络请求中,等待所有请求完成才关闭。并不是说关闭不报错就算优雅关闭了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题