我有一个 python 应用程序,它(并行)产生子进程(主要是 bash 脚本)。一些脚本可能会调用其他脚本。我正在尝试找出处理应用程序和子进程终止边缘情况的最佳方法。
如果应用程序需要退出,或者收到一个SIGTERM
,那么它应该终止 ( SIGTERM
, wait
, SIGKILL
) 所有子进程和它们创建的任何进程。一种方法是作为一个新的进程组开始,并在终止过程中终止该进程组(killpg
)。
如果任何子进程花费的时间超过指定时间,我想杀死它们以及它们创建的子进程。这里的一种方法是将应用程序设置为进程组负责人,这样我就可以杀死该组并依靠它来杀死任何其他子进程。
难点是这两种解决方案相互冲突,所以我似乎只能满足一个要求。
所以,最后一个想法是使用 tcsetpgrp,但我对它并不太熟悉。因此,类似于模拟交互式终端。这意味着终止应用程序会向SIGHUP
所有进程发送一个(我认为),并且我可以使用进程组来管理需要太长时间的终止子进程。
这是一个好主意,还是我缺少任何其他建议?
奖励部分:如果应用程序被杀死SIGKILL
(在这个应用程序中偶尔需要它,是的,我知道SIGKILL
应该避免,等等......),以与 bash 发送相同的方式杀死子进程会很棒SIGHUP
当它退出时,它的进程。