【问题标题】:How to handle a SIGTERM如何处理 SIGTERM
【发布时间】:2011-02-27 20:22:53
【问题描述】:

Java 中有没有办法处理收到的 SIGTERM?

【问题讨论】:

    标签: java exit sigterm


    【解决方案1】:

    是的,您可以使用Runtime.addShutdownHook() 注册关闭挂钩。

    【讨论】:

    • System.exit(1) 在其他地方执行时,该钩子是否也会被触发?我正在尝试遵循这种模式来处理我的多线程 Java 程序的受控停止,我发现 System.exit(1) 没有终止 JVM。
    • @M.E.是的,他们是。请在此处查看 Runtime.exit(由 System.exit 调用)的文档:docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/…
    【解决方案2】:

    您可以添加shutdown hook 进行任何清理。

    像这样:

    public class myjava{
        public static void main(String[] args){
            Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
                public void run() {
                    System.out.println("Inside Add Shutdown Hook");
                }   
            }); 
    
            System.out.println("Shut Down Hook Attached.");
    
            System.out.println(5/0);     //Operating system sends SIGFPE to the JVM
                                         //the JVM catches it and constructs a 
                                         //ArithmeticException class, and since you 
                                         //don't catch this with a try/catch, dumps
                                         //it to screen and terminates.  The shutdown
                                         //hook is triggered, doing final cleanup.
        }   
    }
    

    然后运行它:

    el@apollo:~$ javac myjava.java
    el@apollo:~$ java myjava 
    Shut Down Hook Attached.
    Exception in thread "main" java.lang.ArithmeticException: / by zero
            at myjava.main(myjava.java:11)
    Inside Add Shutdown Hook
    

    【讨论】:

    • 这是针对整个系统关闭的。虽然它在大多数情况下都有效,但理想的情况是它适用于继承的进程。
    【解决方案3】:

    在 Java 中处理信号的另一种方法是通过 sun.misc.signal 包。使用方法请参考http://www.ibm.com/developerworks/java/library/i-signalhandling/

    注意: sun.* 包中的功能也意味着它可能无法在所有操作系统中移植/行为相同。但您可能想尝试一下。

    【讨论】:

    • 但其实也一样?
    • 不——不完全是。我提到的信号处理 API 可用于处理 Java 应用程序中的大多数 Native OS 信号(trap、intr、kill 等)。另一方面,ShutdownHook 仅在 JVM 最终终止时(收到终止信号后)才被调用。
    • 是的,IBM 开发人员的作品似乎已经完成了网站迁移。该链接不再有效。
    • 关于 sun.misc.signal 包的断开链接,请参阅stackoverflow.com/questions/19711062/…
    • 也永远不要使用 sun 类 - 较新的 JDK 会因为这样做而咬你一口,你的代码将无法运行。
    猜你喜欢
    • 2011-08-16
    • 2016-11-09
    • 2021-09-23
    • 2023-04-02
    • 2015-08-11
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    相关资源
    最近更新 更多