从 Java 中终止进程

从 Java 中终止进程

我创建了一个 Java 应用程序,它可以启动进程并捕获它们的 PID,以便应用程序可以监视该进程。用户稍后可以选择终止整个进程树(会话)。我通过使用 setsid 完成了此操作。一种情况是通过 shell 脚本启动一大堆不同的进程:setsid <shell script>。PID 代表新会话,终止它将终止该会话中生成的所有进程。在 Ubuntu 12.10 发布之前,它运行良好。现在我无法终止通过 setsid 启动的所有会话。一个例子是 Firefox 和 Google Earth。如果通过 setsid 启动,Gedit 仍然可以被终止。

我创建了一个执行的简单测试程序kill -SIGTERM -PID。测试程序设法在 Ubuntu 12.04 下杀死通过 setsid 启动的 Firefox,但在 Ubuntu 12.10 下却不行。我不知道发生了什么变化。我使用 OpenJDK 6、7 和 Oracle JDK 6 在两个发行版中执行了该程序。


public class kill
{
        public static void main(String[] args)
        {
    try 
        {
        System.out.println("kill -SIGTERM -" + args[0]);
        Process proc = Runtime.getRuntime().exec("kill -SIGTERM -" + args[0]);
        int exitVal = proc.waitFor();
        System.out.println("Exit value: " + exitVal); // often 1 under Ubuntu 12.10
        }
    catch (Exception e)
        {
        }
}

答案1

在 Ubunutu 12.04 和 Centos 5 + 6 中,可以使用像 SIGTERM 这样的信号名称,但在 12.10 上,必须使用 -TERM。更改我的代码,使信号名称不带前缀“SIG”,这似乎在 12.04 和 12.10 上运行良好。因此,对我有用的示例代码是:

Process proc = Runtime.getRuntime().exec("kill -TERM -" + args[0]);

需要澄清的是,kill -SIGTERM -<PID>它在 Ubuntu 12.10 的 Bash shell 中可以工作,但如果通过 执行则不行Runtime.getRuntime.exec(),必须按照上面所述删除“SIG”部分。

相关内容