如何处理SIGTERM

Mar*_*aux 60 java exit sigterm

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

Mat*_*hen 60

是的,你可以注册一个关机钩子Runtime.addShutdownHook().

  • 当在其他地方执行“System.exit(1)”时,该钩子也会被触发吗?我试图遵循这种模式来处理我的多线程 Java 程序的受控停止,我发现“System.exit(1)”并没有终止 JVM。 (2认同)

Edw*_*ale 39

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

像这样:

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.
    }   
}
Run Code Online (Sandbox Code Playgroud)

然后运行它:

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
Run Code Online (Sandbox Code Playgroud)


arc*_*max 5

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

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

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