Linux Shutdown和Java Shutdown Hook

时间:2016-12-18 16:32:49

标签: java linux signals shutdown

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

3 个答案:

答案 0 :(得分:2)

如果你想在系统关闭时做一些事情,你需要添加一个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
    }
}));

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

来自文档Runtime#addShutdownHook

  

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

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

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

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

这是来自javadoc。

  

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

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