【发布时间】:2011-03-01 22:43:36
【问题描述】:
我需要能够从 java 内部启动和停止外部程序。我开始工作得很好,但是当我停止它时,它会杀死它的父母。事实证明,我正在启动的进程正在用 kill 0 杀死它的整个进程组。有谁知道如何使我的 java 进程不在子程序的进程组中?
【问题讨论】:
-
@Murali VP:如果这是答案,请将其作为答案发布。
标签: java linux runtime.exec
我需要能够从 java 内部启动和停止外部程序。我开始工作得很好,但是当我停止它时,它会杀死它的父母。事实证明,我正在启动的进程正在用 kill 0 杀死它的整个进程组。有谁知道如何使我的 java 进程不在子程序的进程组中?
【问题讨论】:
标签: java linux runtime.exec
所以我猜有两个答案:
1) 创建您的子进程作为新进程组的组长。在 Linux 中,我可以在命令行上使用
bash -c "command <args>"
然后你可以用命令检查新进程的进程组和你运行命令所在的终端不同:
ps -efj
“j”选项显示进程组 ID (PGID)。
我会警告你,你可能不得不奇怪地转义一些东西才能让它从 Java 中正确运行,因为带有参数的命令需要引号,这些参数通过 '-c' 选项传递给 'bash' 命令。所以在Java中我猜它看起来像这样:
Process processWithNewProcessGroup = Runtime.getRuntime().
exec("bash -c \"sleep 60\"");
2) 更改您的子进程,使其不会杀死其进程组中的所有内容。
【讨论】: