我有一个程序可以生成其他程序的许多实例。我希望有一种干净的方法在超时后杀死它们,即使它们产生子进程,有时意外地守护进程等。
现在我使用进程组方法:每个实例都在自己的进程组中运行,当我想要杀死它时,我会向整个组发出信号。到目前为止似乎运行良好。
然而,很容易创建一个新的进程组,从而逃脱我的控制。这些程序本质上并不是恶意的(因此它们不会故意这样做),但编写起来可能非常草率。它们可能是 Python 脚本、丑陋的 shell 脚本,诸如此类。
所以我的问题是,通常什么时候创建进程组?根据我的观察,交互式 shell 创建它们,但非交互式 shell 则不会。例如,它们是否是任何类型的高级 shell 结构,即使在非交互式脚本中也倾向于创建新的进程组?
答案1
好吧,“有时意外地守护进程”将是一个问题——守护进程的一部分是与进程组解除关联。参见,例如,Daemonize 的页面或一个Unix 编程常见问题解答。
除此之外,我遇到的 [*] 是script
,有时您必须使用它来捕获命令的输出(例如,因为它在连接到终端与管道时的行为不同)。script
调用setsid
,它也会启动一个进程组。
也可以在脚本内打开作业控制,这也可能会做到这一点。但不确定这种情况有多常见。
[*] 我个人有一个经常使用的脚本,它mpv
在 a 内运行script
并解析输出。