我正在尝试让我的Java程序在我的unix服务器上正常退出。我有一个jar文件,我早上通过cron工作开始。然后在晚上,当我想关闭它时,我有一个cron作业调用一个找到PID的脚本并调用kill -9 <PID>
。但是,当我以这种方式终止时,似乎没有激活我的关闭挂钩。我也试过kill <PID>
(没有-9),我也遇到了同样的问题。如何确保调用关闭挂钩?或者,也许每天都有更好的方法来杀死我的过程。
class ShutdownHook {
ShutdownHook() {}
public void attachShutDownHook() {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
System.out.println("Shut down hook activating");
}
});
System.out.println("Shut Down Hook Attached.");
}
}
答案 0 :(得分:6)
你可以在Unix上使用这样的代码来捕获SIGINT(#2)信号:
Signal.handle(new Signal("INT"), new SignalHandler() {
public void handle(Signal sig) {
// Forced exit
System.exit(1);
}
});
答案 1 :(得分:4)
kill -9 <pid>
发送KILL
信号。该程序无法拦截此信号。
如果您拨打kill <pid>
,则会发送TERM
信号(15)。在这种情况下,JVM将捕获信号并执行关闭挂钩。
答案 2 :(得分:0)
这与JVM捕获/接收的信号无关,而是与Gnome的可怕关闭过程有关,这显然需要合作而不是完全把床弄脏(并且jdk没有api for this)。如果您想看到更糟糕的后果,请尝试运行:
dbus-monitor --profile --session type='method_call',interface='org.gnome.SessionManager'
在shell上,然后注销或重新启动:它将崩溃gnome-shell并挂起计算机,直到您登录TTY并命令重新启动。 也许kdbus会解决这个问题,也许不是。我唯一知道的是,在使用AWT(而不是命令行)的java应用程序上的shutdownhooks将永远不会在GNOME3上运行其shutdownhooks。实际上,VM将始终以非零代码(失败)退出,可能来自本机代码。至少它没有挂起,虽然这使得关闭挂钩很无用 (我一直试图通过使用dbus-monitor来解决这个问题,但正如你从我给出的例子中看到的那样,它也有点太危险了。)