Tomcat正常关机

时间:2018-10-18 15:57:24

标签: 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中实现正常关机?

1 个答案:

答案 0 :(得分:1)

100秒是脚本在发出终止信号之后等待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"

注意通知最多等待n秒 ...该过程会立即发出信号,脚本最多等待 n 秒让PID消失。发送kill -9信号。请注意,catalina.sh脚本一次不会休眠1秒钟,但仅在它发送了初始关闭信号之后才会休眠。

以下是脚本中的相关行,它们向您确切显示正在发生的事情:

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

通常:

  • 向进程发送kill -15,这是正常的正常关机。现在由JVM启动终止序列。
  • 向过程发送kill -0,以检查其是否有效。如果还活着,请睡一秒钟,然后再次检查。重复此操作,直到a)该过程不再存在,或b)延迟参数(在您的情况下为100秒)过去。
  • 如果此时进程仍仍然仍在运行,并且您提供了-force参数,那么脚本将最后一次尝试向JVM发送kill -9信号。该信号实际上不能由JVM处理,并且操作系统本身会强制立即关闭进程(即,不正常关闭)。

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

sleep 100 && catalina.sh stop