奇怪的问题
我正在尝试在接收信号时正确关闭我的 Java 应用程序,或者通过 kill 手动发送。我尝试杀死 SIGTERM、SIGHUP、SIGINT 等,并且每次 JVM 只是停止而不调用运行时关闭挂钩时,最后都会阻止或发出在 Java 代码中创建的陷阱。
Runtime.getRuntime().addShutdownHook(new Thread("Shutdown hook") {
@Override
public void run() {
vd.pretendRemoveAll();
}
});
并在 shutdownHook 不起作用时添加了处理程序
SignalHandler h = new SignalHandler() {
@Override
public synchronized void handle(Signal sig) {
_logger.warn("Received signal: {}", sig);
vd.pretendRemoveAll();
System.exit(0);
}
};
Signal.handle(new Signal("INT"), h);
Signal.handle(new Signal("KILL"), h);
Signal.handle(new Signal("HUP"), h);
Signal.handle(new Signal("TERM"), h);
我在 Ubuntu 12.04 上运行 Java java 版本“1.6.0_24”
OpenJDK 运行时环境 (IcedTea6 1.11.5) (6b24-1.11.5-0ubuntu1~12.04.1)
OpenJDK 64 位服务器 VM(内部版本 20.0-b12,混合模式)
我也试过用Oracle Java jdk1.6.0_37,效果一样
当我在进程中使用 strace 来查看会发生什么时,我得到:
user@server:~/appdir$ sudo strace -v -p 32277Process 32277 附加 - 中断到 quitfutex(0x7f667f07d9d0, FUTEX_WAIT, 32278, NULL) = ? ERESTARTSYS(要重新启动)--- SIGTERM(终止)@ 0 (0) --- futex(0x7f667e2543e0, FUTEX_WAKE_PRIVATE, 1) = 1 rt_sigreturn(0x7f667e2543e0) = 202 futex(0x7f667f07d9d0, FUTEX_WAIT, 32272 附加 77 NULLIC PID以 143 退出
这个 NULLPANIC 看起来很可疑,但我不知道接下来会发生什么。
我在 Mac 上测试了该代码并且没有问题。任何想法是什么导致了问题以及如何解决这个问题?是否需要设置一些安全功能/策略?