【发布时间】:2011-08-14 02:54:41
【问题描述】:
我想在它自己的进程组中启动一个进程(或者,一旦启动就改变它的组)并且:
- 让组中的进程从终端响应
Ctrl+C - 获取进程组的ID,以便我可以通过
kill命令终止组中的所有进程。
注意:我尝试了setsid prog [args],但进程没有响应终端的 Ctrl+C,也无法获取新的进程组 ID。
我也尝试通过 Perl 的setpgrp($pid, $pid) 和POSIX::setpgid($pid, $pid) 更改进程组,但无济于事。
编辑:更大的问题:
我有一个进程(单线程;我们称之为“多产”进程P),它同步启动许多子进程(一个接一个;当前一个子进程终止时它会启动一个新进程)。从终端,我希望能够杀死 P 和它下面的进程树。为此,我可以简单地安排杀死P 组中的进程。但是,默认行为是P 在其父进程的组中。这意味着如果我杀死 P 组中的所有进程,P 的父级将被杀死,除非我有 P 并且它的树在它们自己的组中。
我的目的是杀死P 和它下面的树,但不是P 的父级。另外,我不能修改P的代码本身。
【问题讨论】:
-
请说明您需要完成与进程启动的默认行为(如下面的 ninjalj 观察到的)有什么区别?
-
我希望我在上面添加的编辑(更大的问题)有助于澄清意图。
-
您可以
fork和setpgrp将进程放在新进程组上。然后,您将拥有 Pp、Pc 和 Pc 的子代,而不是 P 及其子代。由于您在fork之后立即setpgrp'd Pc,它将位于自己的进程组中,因此您可以一口气杀死它及其子进程。有 Ppwait,它会等到 Pc 死亡然后退出(或任何你想要它做的事情)。 -
这正是我们所需要的。谢谢!!只剩下一块拼图可以放置到位。我希望我的父 Perl 脚本以指示它被中断的错误状态终止。请在下面的答案部分查看我的帖子。
标签: linux process process-group