从UNIX关闭挂钩

时间:2012-10-25 18:38:40

标签: java unix shutdown-hook

我正在尝试让我的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.");
    }   
}

3 个答案:

答案 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来解决这个问题,但正如你从我给出的例子中看到的那样,它也有点太危险了。)