4

我有一个 python 应用程序,它(并行)产生子进程(主要是 bash 脚本)。一些脚本可能会调用其他脚本。我正在尝试找出处理应用程序和子进程终止边缘情况的最佳方法。

如果应用程序需要退出,或者收到一个SIGTERM,那么它应该终止 ( SIGTERM, wait, SIGKILL) 所有子进程和它们创建的任何进程。一种方法是作为一个新的进程组开始,并在终止过程中终止该进程组(killpg)。

如果任何子进程花费的时间超过指定时间,我想杀死它们以及它们创建的子进程。这里的一种方法是将应用程序设置为进程组负责人,这样我就可以杀死该组并依靠它来杀死任何其他子进程。

难点是这两种解决方案相互冲突,所以我似乎只能满足一个要求。

所以,最后一个想法是使用 tcsetpgrp,但我对它并不太熟悉。因此,类似于模拟交互式终端。这意味着终止应用程序会向SIGHUP所有进程发送一个(我认为),并且我可以使用进程组来管理需要太长时间的终止子进程。

这是一个好主意,还是我缺少任何其他建议?

奖励部分:如果应用程序被杀死SIGKILL(在这个应用程序中偶尔需要它,是的,我知道SIGKILL应该避免,等等......),以与 bash 发送相同的方式杀死子进程会很棒SIGHUP当它退出时,它的进程。

4

1 回答 1

0

一种使您的脚本自动终止的可能性。

Perl 有一个可以设置警报的结构。

这个网站上的好例子在这里:

https://stackoverflow.com/questions/3427401/perl-make-script-timeout-after-x-number-of-seconds

Perl,在 x 秒后使脚本超时?

搜索 python 警报超时脚本也有类似的命中。

https://stackoverflow.com/questions/1191374/subprocess-with-timeout

使用带有超时的模块“子进程”

这具有副作用(优点或错误......),只要子进程的超时时间比父进程短,那么父进程就可以优雅地恢复。

但是,最好通过 CPU 时间而不是墙时间来限制进程。通过这种方式,一个遥远的后代不会为父母花费时间,如果整个系统由于许多进程而变慢,你就不会在你的子进程中遇到死亡瘟疫。

您可以通过输入在 bash 脚本中执行此操作

ulimit -t X 

其中 x 是您想要的 cpu 秒数。但是请注意,在大多数系统上,它是单向街道。一个进程不能增加它自己的限制。

于 2013-03-13T21:09:36.253 回答