Tomcat优雅关机

Gna*_*ana 0 java tomcat shutdown tomcat8

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

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

如何在Tomcat中实现优雅关机?

Mik*_*ike 5

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"
Run Code Online (Sandbox Code Playgroud)

请注意等待最多 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以检查它是否还活着。如果还活着,则休眠 1 秒并再次检查。重复此操作,直到 a) 进程不再存在,或 b) 延迟参数(在您的情况下为 100 秒)已经过去。
  • 如果此时进程仍处于活动状态,并且您提供了-force参数,则脚本最后一次尝试kill -9向 JVM发送信号。这个信号实际上不能由 JVM 处理,操作系统本身会强制立即关闭进程(即非正常关闭)。

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

sleep 100 && catalina.sh stop
Run Code Online (Sandbox Code Playgroud)

  • 您对优雅关闭的理解不准确。它只是意味着给进程一个正常终止的机会(即使用带有默认“TERM”信号的常规“kill”命令)。JVM可以捕获这个信号并执行定期关闭。该命令立即从 catalina.sh 发送,没有延迟。_n_ 参数是脚本将持续检查进程结束的时间。_n_ 秒后,如果 PID 仍在运行并且您还提供了“-force”,catalina.sh 将使用“kill -9”。任何进程都无法处理该信号,操作系统会立即停止该进程。 (2认同)