终止应用,多个嵌套子流程
Posted
技术标签:
【中文标题】终止应用,多个嵌套子流程【英文标题】:Termination of application, multiple nested subprocesses 【发布时间】: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 程序中遇到了同样的问题。 【参考方案1】:一种让您的脚本自动终止的可能性。
Perl 有一个可以设置警报的结构。
这个网站上的好例子在这里:
https://***.com/questions/3427401/perl-make-script-timeout-after-x-number-of-seconds
Perl, make script timeout after x number of seconds?
搜索python报警超时脚本也有类似的命中。
https://***.com/questions/1191374/subprocess-with-timeout
Using module 'subprocess' with timeout
这有一个副作用(优点或错误...),只要子进程的超时时间比父进程短,那么父进程就可以正常恢复。
不过,最好通过 CPU 时间而不是墙时间来限制进程。这样一来,遥远的后代就不会为父进程浪费时间,而且如果整个系统由于许多进程而变慢,您就不会在子进程中遇到死亡瘟疫。
你可以在 bash 脚本中输入
ulimit -t X
其中 x 是您想要的 cpu 秒数。但是请注意,在大多数系统上,它是单向街道。进程不能增加它自己的限制。
【讨论】:
以上是关于终止应用,多个嵌套子流程的主要内容,如果未能解决你的问题,请参考以下文章