【问题标题】:Linux Shutdown and Java Shutdown HookLinux 关机和 Java 关机挂钩
【发布时间】:2016-12-18 16:32:49
【问题描述】:

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

【问题讨论】:

    标签: java linux signals shutdown


    【解决方案1】:

    如果你想在系统关机时做点什么,你需要添加一个关机钩子(假设你已经这样做了):

    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

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

    【讨论】:

    • 他问的是钩子是否会在关机时运行,而不是如何去做。
    • 我也增加了一些精度
    【解决方案2】:

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

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

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

    我记得在某个地方读到过(但我再也找不到链接了)——它说关闭挂钩不应该花费太多时间来执行,否则当系统想要关闭时,Windows 可能会杀死它。这表明如果您决定通过操作系统关闭系统,将运行关闭挂钩。

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


    这是来自 javadoc。

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-19
        • 1970-01-01
        相关资源
        最近更新 更多