【发布时间】:2012-11-01 13:44:13
【问题描述】:
我有一个 python 应用程序,它(并行)产生子进程(主要是 bash 脚本)。一些脚本可能会调用其他脚本。我正在尝试找出处理应用程序和子进程终止边缘情况的最佳方法。
如果应用程序需要退出,或者收到SIGTERM,那么它应该终止(SIGTERM、wait、SIGKILL)所有子进程和它们创建的任何进程。解决此问题的方法是作为一个新进程组启动并在终止过程中终止该进程组 (killpg)。
如果任何子进程花费的时间超过指定时间,我想杀死它们以及它们创建的子进程。这里的一种方法是将应用程序设置为进程组领导,这样我就可以杀死该组并依靠它来杀死任何其他子进程。
难点是这两种解决方案相互冲突,所以我似乎只能满足一个要求。
所以,最后一个想法是使用 tcsetpgrp,但我对它并不太熟悉。因此,类似于模拟交互式终端。这意味着杀死应用程序会向所有进程发送SIGHUP(我认为),并且我可以使用进程组来管理杀死需要太长时间的子进程。
这是一个好主意,还是我还缺少其他建议?
奖金部分:
如果应用程序通过SIGKILL 被杀死(在这个应用程序中偶尔需要它,是的,我知道应该避免使用SIGKILL,等等...),以同样的方式杀死子进程会很棒bash 在退出时向其进程发送SIGHUP。
【问题讨论】:
-
如果您可以杀死单个子进程(使用 os.setsid 创建)及其所有子进程,那么要杀死由您的应用程序生成的所有子进程,您可以使用 for 循环。我没有看到冲突。
-
嗯,我忘记了可选的奖金部分。所以这肯定适用于 SIGTERM。然而,我仍然想深入研究这个世界,即使是 SIGKILL 也会在退出时杀死这些子进程。
-
您有没有为这种情况找到一个好的解决方案?我在我的 python 程序中遇到了同样的问题。
标签: linux process operating-system signals subprocess