代码之家  ›  专栏  ›  技术社区  ›  Gnana

Tomcat优雅关机

  •  1
  • Gnana  · 技术社区  · 8 年前

    我正在使用Tomcat 8。x、 并使用startup启动tomcat。我使用JPS命令验证了tomcat是否已启动并正在运行。我要阻止雄猫使用 卡塔琳娜。sh停止100 。根据catalina shell脚本,它将等待100秒来终止tomcat进程。但经JPS命令验证,tomcat进程立即终止。

    为什么关闭不起作用?

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

    1 回复  |  直到 8 年前
        1
  •  7
  •   Mike    8 年前

    100秒是脚本在发出kill信号后等待进程停止的时间,然后以更大的力度终止它 kill -9 .仅仅因为这个过程很快停止,并不意味着它不是一次彻底的关闭。

    来自卡塔琳娜。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在发送数据前消失的秒数 杀死-9 信号注意卡塔琳娜。sh脚本一次只休眠1秒,但只有在它发送了初始关机信号之后。

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

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

    一般来说:

    • 发封信 kill -15 这是一个正常、优雅的关机过程。现在是JVM开始终止序列的时候了。
    • 发封信 kill -0 检查进程是否处于活动状态。如果它还活着,睡一秒钟,然后再次检查。重复此操作,直到a)进程不再处于活动状态,或b)延迟参数(在您的情况下为100秒)已过。
    • 如果过程是 还 现在还活着,你已经提供了 -force 参数,脚本最后一次尝试发送 杀死-9 向JVM发送信号。JVM实际上无法处理该信号,操作系统本身会强制立即关闭进程(即不正常关闭)。

    请注意,所有这些都立即发生,没有任何延迟。如果您想在尝试上述关机顺序之前进行一些人工暂停,您应该使用 sleep 在给卡塔琳娜打电话之前。上海:

    sleep 100 && catalina.sh stop