如何处理SIGTERM


Answers:



49

您可以添加一个关闭挂钩来进行任何清理。

像这样:

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

不过,这是针对整个系统关闭的。尽管它在大多数情况下都可以工作,但理想的情况是它可以在继承的过程中工作。
mmm

4

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

注意:该功能位于sun。*软件包中,这也意味着它可能在所有操作系统上都不是可移植的/行为相同的。但是您可能想尝试一下。


但是实际上,它是一样的吗?
Martijn Courteaux 2010年

2
不,不完全是。我提到的信号处理API可用于处理Java Apps中的大多数本机OS信号(陷阱,插入,终止等)。另一方面,只有在JVM最终终止时(接收到终止信号之后),才调用ShutdownHook。
arcamax 2010年

1
是的,看来IBM开发人员的工作已经经历了网站迁移。链接不再有效。
arcamax 2014年

关于断开的链接到sun.misc.signal包,请参阅stackoverflow.com/questions/19711062/...
丹尼尔·

也不要使用sun类-较新的JDK会因为这样做而咬您,并且您的代码将无法运行。
伊桑·麦考
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.