5

我试图让我的 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.");
    }   
}
4

3 回答 3

6

您可以在 Unix 上使用这样的代码来捕获 SIGINT (#2) 信号:

Signal.handle(new Signal("INT"), new SignalHandler() {
      public void handle(Signal sig) {
      // Forced exit
      System.exit(1);
   }
});
于 2012-10-25T18:42:11.623 回答
4

kill -9 <pid>发出KILL信号。该信号不能被程序截获。

如果您调用kill <pid>,将TERM发送信号 (15)。在这种情况下,JVM 将捕获信号并执行关闭挂钩。

于 2012-10-25T18:43:24.607 回答
0

这与 JVM 捕获/接收的信号无关,而是与 Gnome 可怕的关闭过程有关,这显然需要合作,不要绝对拉屎(而且 jdk 没有用于此的 api )。如果您想看到更糟糕的后果,请尝试运行:

dbus-monitor --profile --session type='method_call',interface='org.gnome.SessionManager'

在外壳上,然后注销或重新启动:它将使 gnome-shell 崩溃并挂起计算机,直到您登录 TTY 并命令重新启动。也许 kdbus 会在这种情况下解决这个问题,也许不会。我唯一知道的是,使用 AWT(不是命令行)的 java 应用程序上的shutdownhooks 永远不会在 GNOME3 上运行它的shutdownhooks。实际上,VM 将始终以可能来自本机代码的非零代码(失败)退出。至少它不会挂起,尽管这使得关闭挂钩非常无用(我一直在尝试通过使用 dbus-monitor 来解决问题,但是从我给出的示例中可以看出,它也有点太危险了)。

于 2014-03-08T22:22:43.627 回答