Linux 关机和 Java 关机挂钩

Linux Shutdown and Java Shutdown Hook

当我在后台 运行 一个 Java 进程并关闭计算机 (ArchLinux) 时,计算机是否会等待几秒钟以终止我在 [=14= 中的关机挂钩]?

您可以将 java 程序包装为服务,它会随着 OS 启动和关闭。最简单的方法之一是使用 spring boot framework.

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

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

When the virtual machine is terminated due to user logoff or system shutdown the underlying operating system may only allow a fixed amount of time in which to shut down and exit. It is therefore inadvisable to attempt any user interaction or to perform a long-running computation in a shutdown hook.

调用关闭 JVM 时将调用关闭挂钩。但是,不能保证会调用挂钩。钩子可能 not/won 不是 运行:

  • 如果 JVM 因内部错误而崩溃。
  • 如果发出 SIGKILL 信号,或在 linux 中 kill -9 并在 windows 中终止进程。
  • Runtime.halt() 也会阻止挂钩开始 运行。
  • 电脑电源被拔掉(插头处)
  • 你的 OS 崩溃了。

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

我记得在某个地方读过(但我又找不到 link)- 它说关闭挂钩不应该花费太多时间来执行,否则 windows 可能会在系统要关机。这表示如果您决定通过 OS.

关闭系统,则关闭挂钩将为 运行

Tl;dr:这取决于,直接拉电源或者如果 OS 崩溃,它们不会 运行。正常的 OS 关闭将 运行 钩子,尽管如果它们花费的时间太长, OS 可能会在它们完成之前关闭它们。


这是来自 javadoc。

When the virtual machine is terminated due to user logoff or system shutdown the underlying operating system may only allow a fixed amount of time in which to shut down and exit. It is therefore inadvisable to attempt any user interaction or to perform a long-running computation in a shutdown hook.

这表明当 OS 想要关闭时,钩子将 运行,但建议不要花太长时间,否则它们可能会被杀死。