【问题标题】:Graceful termination of a Java program and logging of terminate signalsJava 程序的优雅终止和终止信号的记录
【发布时间】:2014-10-03 04:14:04
【问题描述】:

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

    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. 如何打印捕获的信号?

【问题讨论】:

    标签: java multithreading runtime signals


    【解决方案1】:

    这是实现优雅终止的好方法吗?

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

    如何打印捕捉到的信号?

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

    【讨论】:

      【解决方案2】:

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

      另一种方法是使用 JNI 接口安装信号处理程序,本地处理程序将调用一些 Java 代码来执行实际操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-09
        • 2019-08-01
        相关资源
        最近更新 更多