java - Tomcat 优雅关机

标签 java tomcat tomcat8 shutdown

我正在使用 Tomcat 8.x.x 并使用 startup.sh 启动 tomcat。我使用 JPS 命令验证了 tomcat 已启动并正在运行。我正在使用 catalina.sh stop 100 停止 Tomcat。正如 catalina shell 脚本所说,它将等待 100 秒以终止 tomcat 进程。但是 tomcat 进程立即终止,通过 JPS 命令验证。

为什么正常关机不起作用?

Tomcat如何实现Graceful shutdown?

最佳答案

100 秒是脚本在发出 kill 信号后等待进程停止的时间,然后再使用 kill -9 更有力地终止它。仅仅因为该过程很快停止,并不意味着它不是干净的关闭。

来自 catalina.sh 帮助部分:

echo "  stop              Stop Catalina, waiting up to 5 seconds for the process to end"
echo "  stop n            Stop Catalina, waiting up to n seconds for the process to end"
echo "  stop -force       Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running"
echo "  stop n -force     Stop Catalina, wait up to n seconds and then use kill -KILL if still running"

注意措辞waiting up to n seconds ...进程立即收到信号,脚本等待 PID 在它之前消失 n 秒发送 kill -9 信号。请注意,catalina.sh 脚本确实一次 hibernate 1 秒,但只有在它发送初始关闭信号后才会 hibernate 。

以下是脚本中的相关行,可以准确地向您展示正在发生的事情:

https://github.com/apache/tomcat/blob/a8c62dd061d4cf937c3bdec615121696916434eb/bin/catalina.sh#L525-L600

一般来说:

  • 向进程发送一个kill -15,这是正常的、正常的关闭。现在由 JVM 开始其终止序列。
  • 向进程发送一个kill -0 来检查它是否存活。如果它还活着,则 hibernate 1 秒并再次检查。重复此操作,直到 a) 进程不再存在,或 b) 延迟参数(在您的情况下为 100 秒)已经过去。
  • 如果此时进程仍然存在,并且您提供了-force 参数,脚本将最后一次尝试发送kill - 9 给 JVM 的信号。 JVM 实际上无法处理此信号,并且操作系统本身会强制立即关闭进程(即非正常关闭)。

请注意,所有这些都是立即发生的,没有任何延迟。如果你想在尝试上面的关闭序列之前有一些人为的暂停,你应该在调用 catalina.sh 之前使用 sleep:

sleep 100 && catalina.sh stop

关于java - Tomcat 优雅关机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52878053/

相关文章:

带有 JSF2.2 的 Spring Boot : Error getting customize embedded tomcat

mysql - Tomcat6 jk-8009 服务使用 100% CPU

tomcat8 - Web 应用程序似乎启动了一个名为 [HikariPool-1 管家] 的线程,但未能阻止它

tomcat - 基于 APR 的 Apache Tomcat Native 库的不兼容版本 [1.1.34]

java - 无法确定任务 ':app:compileDebugJavaWithJavac' 的依赖关系。在 Cordova 有问题

java - 如何回滚除异常之外的所有内容以存储在表中

java - 如何使用 Apache POI 创建链接到长 url 的 Excel 超链接

java - Apache Tomcat HTTP 状态 405 - 此 URL 不支持 HTTP 方法 GET

java - 运行一个简单的代码Mapreduce

tomcat - 用于文件上传的 URL 重写 Tomcat