gpt4 book ai didi

Java 应用程序在 Ubuntu 12.04 上不接收信号

转载 作者:搜寻专家 更新时间:2023-11-01 03:56:51 26 4
gpt4 key购买 nike

奇怪的问题

我正在尝试在接收到信号时正确关闭我的 Java 应用程序,要么通过 kill 手动发送。我试过 kill SIGTERM、SIGHUP、SIGINT 等,每次 JVM 只是停止而不调用运行时关闭 Hook ,最终阻止或在 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 上运行 JavaJava 版本“1.6.0_24”

OpenJDK Runtime Environment (IcedTea6 1.11.5) (6b24-1.11.5-0ubuntu1~12.04.1)

OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)

我也用Oracle Java jdk1.6.0_37试过,效果一样

当我在进程上使用 strace 查看发生了什么时,我得到:

user@server:~/appdir$ sudo strace -v -p 32277Process 32277 attached - interrupt to quitfutex(0x7f667f07d9d0, FUTEX_WAIT, 32278, NULL) = ? ERESTARTSYS (To be restarted) --- SIGTERM (Terminated) @ 0 (0) --- futex(0x7f667e2543e0, FUTEX_WAKE_PRIVATE, 1) = 1 rt_sigreturn(0x7f667e2543e0) = 202 futex(0x7f667f07d9d0, FUTEX_WAIT, 32278, NULLPANIC: attached pid 32277 exited with 143

这个 NULLPANIC 看起来很可疑,但我不知道接下来会发生什么。

我在 Mac 上测试了该代码,没有问题。任何想法是什么导致了问题以及如何解决?是否需要设置一些安全功能/策略?

最佳答案

下面的代码灵感来自 http://hellotojavaworld.blogspot.fr/2010/11/runtimeaddshutdownhook.html , 在 Ubuntu 上运行良好,jdk 1.6.30,如何调用 addShutdownHook 方法?您必须在 Class 实例中,而不是在静态 main 方法中。

public class AddShutdownHookSample {
public void attachShutDownHook(){
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
System.out.println("Inside Add Shutdown Hook");
}
});
System.out.println("Shut Down Hook Attached.");
}
public static void main(String[] args) throws InterruptedException {

AddShutdownHookSample sample = new AddShutdownHookSample();
sample.attachShutDownHook();
Thread.sleep(1000*60*1);
//Print a message
System.out.println("Last instruction of Program....");
System.exit(0);
}}

关于Java 应用程序在 Ubuntu 12.04 上不接收信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13642742/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com