如何在不强制的情况下杀死Java中的进程?

时间:2009-08-25 13:01:38

标签: java

我有一个运行许多其他程序的Java程序。一旦用户完成,他们就有一个按钮来杀死所有进程,这应该会杀死所有正在运行的东西,但它应该强制执行它们。这些其他进程中至少有一个也是用Java编写的,并且有许多关闭挂钩,因为它会在退出时自动保存首选项文件并杀死它自己启动的进程,例如。

    Runtime.getRuntime().addShutdownHook(new Thread() {
      public void run() {
        if (process != null)
            process.destroy();
      }
    }

当主进程调用destroy时,上述代码不会在子进程上运行。无论如何,我可以终止进程,这样仍然可以运行吗?

我从Perl移植它会杀死它(9,@ kill_process);

感谢。

2 个答案:

答案 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。