【发布时间】:2012-10-25 18:38:40
【问题描述】:
我正在尝试让我的 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.");
}
}
【问题讨论】:
-
kill -9是保证的 UNIX I-don't-care-if-you're-printing-rainbows-you-will-halt-NOW 标志。使用它不会给你一个很好的关机。它也不能被困住。我想知道的是,如果您在代码中的任何位置使用System.exit()- 这可能是一个好的开始。 -
这篇文章 (link) 似乎表明 SIGTERM 生成了一个 Java System.exit(),因此退出挂钩应该可以工作。您是否通过在 JVM 中生成 System.exit() 来测试钩子行为?
-
可能你使用了错误的 PID。
-
嗯,确实很奇怪。你说的对。插入钩子后,我添加了一个
System.exit(0);调用。在 Windows 上的 Eclipse 环境中,我看到正在应用关闭挂钩,但是当我将其启动并将其移植到我的 unix 服务器时,我看到应用程序正在关闭,但没有关闭挂钩...... -
@Roman 这绝对是正确的 PID
标签: java unix shutdown-hook