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);
}
}
- 这是实现正常终止的好办法?
- 如何打印出捕捉到的信号?
答
这是实施优美终止的好方法吗?
你没有太多的工作,所以优雅并不意味着什么。关机挂钩确实是处理这些信号的唯一方法。
如何打印出捕获的信号?
你不行。该信号在JVM级别捕获。它会运行System#exit(int)
(或更确切地说Shutdown#exit(int)
)。 JVM不提供任何您可以使用的额外信息。
答
检查sun.misc.SignalHandler(http://www.docjar.com/html/api/sun/misc/SignalHandler.java.html)。
其他方式是使用JNI接口来安装信号处理程序,其中本地处理程序将调用一些Java代码来执行真正的事情。