Java程序的优雅终止和终止信号的记录

问题描述:

在Linux(CentOS 6)上运行的Java 8应用程序中,我希望能够正常终止它并记录捕获信号的类型(SIGTERM,SIGINT,SIGHUP) 。Java程序的优雅终止和终止信号的记录

private static volatile boolean die = false; 

    public static void main(String[] args) throws InterruptedException 
    { 

      // Catch terminate signals 
      Runtime.getRuntime().addShutdownHook(
        new Thread() 
        { 
          @Override 
          public void run() 
          { 
            System.out.println("Caught signal " + ???); 
            die = true; 
            System.exit(1); 
          } 
        } 
      ); 


      int i = 0; 
      while (true && !die) { 
        System.out.println("Test " + i++); 
        Thread.sleep(4000); 
      } 

      if (die) { 
        System.out.println("Dying..."); 
        Runtime.getRuntime().halt(1); 
      } 
} 
  1. 这是实现正常终止的好办法?
  2. 如何打印出捕捉到的信号?

这是实施优美终止的好方法吗?

你没有太多的工作,所以优雅并不意味着什么。关机挂钩确实是处理这些信号的唯一方法。

如何打印出捕获的信号?

你不行。该信号在JVM级别捕获。它会运行System#exit(int)(或更确切地说Shutdown#exit(int))。 JVM不提供任何您可以使用的额外信息。

检查sun.misc.SignalHandler(http://www.docjar.com/html/api/sun/misc/SignalHandler.java.html)。

其他方式是使用JNI接口来安装信号处理程序,其中本地处理程序将调用一些Java代码来执行真正的事情。