繁体   English   中英

Linux Shutdown和Java Shutdown Hook

[英]Linux Shutdown and Java Shutdown Hook

当我在后台运行Java进程并关闭计算机(ArchLinux)时,计算机是否会等待几秒钟以终止Java中的shutdown-hook?

如果你想在系统关闭时做一些事情,你需要添加一个shutdown-hook(假设你已经这样做了):

Runtime.getRuntime().addShutdownHook(
new Thread(new Runnable() {
    @Override
    public void run() {
        // This method will be executed and Virtual Machine will close when this method will return
    }
}));

如果花费太多时间 ,系统将永远不会等待完全终止

来自doc Runtime#addShutdownHook

当虚拟机因用户注销或系统关闭而终止时,底层操作系统可能只允许一段固定的时间来关闭和退出。 因此,不建议尝试任何用户交互或在关闭钩子中执行长时间运行的计算。

您可以将Java程序包装为服务,它将启动并关闭操作系统。 最简单的方法之一是使用spring boot框架

当关闭JVM的调用被调用时,将调用关闭钩子。 但是,无法保证将调用挂钩。 钩子可能不会/不会运行:

  • 如果JVM因内部错误而崩溃。
  • 如果发出SIGKILL信号,或者在linux中杀死-9,在windows中杀死TerminateProcess。
  • Runtime.halt()还将阻止钩子开始运行。
  • 拉动计算机电源(插头处)。
  • 你的操作系统崩溃了。

当用户关闭计算机时(而不是通过拉动插头),计算机会向JVM发送一个关闭命令,该命令将执行关闭挂钩,但是如果拔掉电源,计算机将没有时间做任何事情,让单独向JVM发出命令。

我记得在某处读过(但我再也找不到链接) - 它说一个关闭钩子不应该花费很多时间来执行,或者当系统想要关闭时windows可能会杀死它。 这表示如果您决定通过操作系统关闭系统,将运行关闭挂钩。

Tl; dr:这取决于直接拉动电源,或者如果操作系统崩溃,它们将无法运行。 正常的操作系统关闭将运行挂钩,但操作系统可能会在完成之前关闭它们,如果它们花费的时间太长。


这是来自javadoc。

当虚拟机因用户注销或系统关闭而终止时,底层操作系统可能只允许一段固定的时间来关闭和退出。 因此,不建议尝试任何用户交互或在关闭钩子中执行长时间运行的计算。

这表明当操作系统想要关闭时会挂起钩子,但是建议它们不会花很长时间或者它们可能会被杀死。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM