【问题标题】:Tomcat graceful shutdownTomcat 优雅关闭
【发布时间】:2018-10-18 15:57:24
【问题描述】:

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

为什么不能正常关机?

Tomcat如何实现优雅关机?

【问题讨论】:

    标签: java tomcat tomcat8 shutdown


    【解决方案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 秒 ...进程立即发出信号,脚本等待 PID 在它之前消失的时间长达 n 秒发送kill -9 信号。请注意,catalina.sh 脚本每次会休眠 1 秒,但只有在它发送了初始关闭信号之后。

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

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

    一般:

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

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

    sleep 100 && catalina.sh stop
    

    【讨论】:

    • 感谢您的回答。我没有看到脚本执行或 tomcat 终止有任何延迟。脚本立即执行,tomcat 立即终止。请尝试告诉我。
    • 正确,这是设计使然。 n 参数是不是 停止进程的延迟,它是等待进程停止的时间。如果你想在关机前延迟,你需要在调用 catalina.sh 之前使用 sleep 或其他命令。
    • 对不起,我不明白。正常关闭意味着它会在终止进程之前给出延迟。在这里,我的 tomcat 进程立即终止。我使用 JPS 命令进行了验证。我在哪里看到延迟?在脚本中(否),在 tomcat 中(否),进程 ID(否)。请提供更多细节以了解tomcat中的优雅关闭
    • 您对优雅关机的理解并不准确。它只是意味着让进程有机会正常终止(即使用带有默认TERM 信号的常规kill 命令)。 JVM 可以捕获此信号并执行定期关闭。该命令立即从 catalina.sh 发送,没有延迟。 n 参数是脚本将持续检查进程结束的时间。 n 秒后,如果 PID 仍在运行并且您还提供了-force,catalina.sh 将使用kill -9。该信号不能被任何进程处理,操作系统会立即停止该进程。
    • 通过首先使用kill -15,JVM 应该有机会停止接受请求并在终止前完成飞行请求。如果不是,您可以考虑启用关闭端口并查看是否效果更好:tomcat.apache.org/tomcat-8.0-doc/config/server.html
    猜你喜欢
    • 2013-08-10
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 2014-02-05
    相关资源
    最近更新 更多