我有一个运行许多其他程序的Java程序。一旦用户完成,他们就有一个按钮来杀死所有进程,这应该会杀死所有正在运行的东西,但它应该强制执行它们。这些其他进程中至少有一个也是用Java编写的,并且有许多关闭挂钩,因为它会在退出时自动保存首选项文件并杀死它自己启动的进程,例如。
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
if (process != null)
process.destroy();
}
}
当主进程调用destroy时,上述代码不会在子进程上运行。无论如何,我可以终止进程,这样仍然可以运行吗?
我从Perl移植它会杀死它(9,@ kill_process);
感谢。
答案 0 :(得分:6)
Kill signal 9(SIGKILL)告诉操作系统终止进程。该过程不会事先通知这种情况会发生,因此不能进行任何清理。
process.destroy()相当于Perl的kill(9,@kill_process);
,你的旧进程也不会进行任何清理。
杀死信号15(SIGTERM)将告诉进程自杀。
答案 1 :(得分:2)
如何与应用程序通信有多种方法。其中最常见的是发送信号。信号命令称为kill。您发布的Perl代码使用此方法。
你可以发送各种信号,其中一些是由应用程序处理的,其中一些是由os处理的。 默认信号是HUP。它告诉应用程序“与用户的连接”被终止(它实际上意味着调制解调器被挂起)并且它应该退出。表现良好的应用程序将退出。
如果您发送信号9(这是您的perl代码所做的),操作系统将毫无疑问终止应用程序。
另一种方法是使用其默认方式与应用程序通信。因此,您可以将“Ctrl + c”或“Alt + f4”(通常是最终应用程序的命令)发送到流程的STDIN。