gpt4 book ai didi

java - Tomcat 优雅关机

转载 作者:行者123 更新时间:2023-11-28 22:10:29 24 4
gpt4 key购买 nike

我正在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com