2

我正在kill -15 <PID>使用我的工作 jvm,它似乎完全被忽略了。

环境是:

  • Linux 2.6 内核
  • jdk 1.6.0_20-x86-64

项目中没有引用sun.misc.SignalHandler。我唯一的(相当蹩脚的)线索是AbstractApplicationContext.registerShutdownHook()在 main 中调用。JVM 启动参数不包含任何与信号处理相关的内容。

日志中没有任何内容(调试级别),也没有任何内容打印到标准输出以响应kill -15.

如何找出导致忽略 SIGTERM 的原因?

4

1 回答 1

2

通常,JVM线程上的信号1(SIGHUP)、2(SIGINT)、4(SIGILL)、7(SIGBUS)、8(SIGFPE)、11(SIGSEGV)和15(SIGTERM)会导致JVM关闭;因此,除非不再需要 JVM,否则应用程序信号处理程序不应尝试从中恢复。

由于您的jvm没有退出,您可能需要检查是否存在:

  1. 任何使用Runtime.addShutdownHook

  2. JVM 启动时存在 -Xrs 选项

  3. sun.misc.SignalHandler 的任何使用。

这是 Spring 源代码中的 AbstractApplicationContext.registerShutdownHook()。

public void registerShutdownHook() {
if (this.shutdownHook == null) {
        // No shutdown hook registered yet.
    this.shutdownHook = new Thread() {
        @Override
        public void run() {
        doClose();
        }
    };
    Runtime.getRuntime().addShutdownHook(this.shutdownHook);
}
}
于 2013-03-08T11:19:52.363 回答