我创建了一个 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”部分。