我有一个 python 应用程序,它(并行)生成子进程(主要是 bash 脚本)。一些脚本可能会调用其他脚本。我正在尝试找出处理应用程序和子进程的终止边缘情况的最佳方法。
如果应用程序需要退出,或收到 SIGTERM
,那么它应该终止( SIGTERM
、 wait
、 SIGKILL
)所有子进程和它们创建的任何进程。一种方法是作为一个新的进程组开始,并在终止( killpg
)的过程中终止该进程组。
如果任何子进程花费的时间超过指定的时间,我想杀死它们以及它们创建的子进程。这里的一种方法是将应用程序设置为进程组领导,这样我就可以杀死该组并依靠它来杀死任何其他子进程。
难点在于这两种解决方案相互冲突,所以我似乎只能满足一个要求。
所以,最后一个想法是使用 tcsetpgrp,但我对它并不太熟悉。因此,类似于模拟交互式终端。这意味着杀死应用程序会向所有进程发送 SIGHUP
(我认为),我可以使用进程组来管理需要很长时间的杀死子进程。
这是一个好主意,还是我遗漏了其他任何建议?
奖金部分:
如果应用程序通过 SIGKILL
被杀死(在这个应用程序中偶尔需要它,是的,我知道应该避免使用 SIGKILL
,等等...),以与 bash 发送 SIGHUP
相同的方式杀死子进程会很棒当它退出时到它的进程。
最佳答案
一种使您的脚本自行终止的可能性。
Perl 有一个结构,您可以在其中设置警报。
本网站上的 eslewhere 很好的例子:
https://stackoverflow.com/questions/3427401/perl-make-script-timeout-after-x-number-of-seconds
Perl, make script timeout after x number of seconds?
搜索python警报超时脚本有类似的命中。
https://stackoverflow.com/questions/1191374/subprocess-with-timeout
Using module 'subprocess' with timeout
这具有副作用(优势或错误......),只要子进程的超时时间比父进程短,那么父进程就可以正常恢复。
然而,通过 CPU 时间而不是挂墙时间来限制进程可能会更好。通过这种方式,远距离后代不会为父进程占用时间,并且如果整个系统由于许多进程而变慢,则您的子进程中不会出现死亡瘟疫。
您可以通过输入在 bash 脚本中执行此操作
ulimit -t X
其中 x 是您想要的 cpu 秒数。但是请注意,在大多数系统上,它是单向街道。一个进程不能增加它自己的限制。
关于linux - 应用程序终止,多个嵌套子进程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13355499/