应用程序终止,多个嵌套的subprocess

我有一个python应用程序(并行)产生subprocess(主要是bash脚本)。 一些脚本可能会调用其他脚本。 我试图找出最好的方法来处理应用程序和subprocess的终止边界情况。

如果应用程序需要退出或收到一个SIGTERM ,那么它应该终止( SIGTERMwaitSIGKILL )所有的subprocess和它们创build的进程。 一个方法是开始一个新的进程组,杀死进程组作为终止( killpg )的一部分。

如果任何subprocess比指定的时间更长,我想杀死它们以及它们创build的subprocess。 这里的一个方法是将应用程序设置为一个进程组领导,这样我就可以杀死这个组,并依靠它来杀死其他的subprocess。

困难的是这两个解决scheme相互冲突,所以我似乎只能满足一个要求。

所以,最后的想法是使用tcsetpgrp,但我不太熟悉它。 所以,像模拟一个交互式terminal。 这意味着杀死应用程序会向所有进程发送一个SIGHUP (我认为),并且我可以使用进程组来pipe理耗时过长的subprocess。

这是一个好主意,还是有其他的build议,我失踪了?

奖金部分:如果应用程序是通过SIGKILL杀死的(在这个应用程序中偶尔需要,是的,我知道SIGKILL应该避免,等等…),这将是惊人的,有杀死subprocess以及相同的方式bash退出时向其进程发送一个SIGHUP

一个可能性使你的脚本自我终止。

Perl有一个可以设置闹钟的构造。

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

 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 

超时使用模块“subprocess”

这有副作用(优点或错误…),只要子进程比父进程有一个较短的超时,那么父进程可能会恢复正常。

但是可能更好的是通过CPU时间来限制进程,而不是花时间。 通过这种方式,一个遥远的后代不会为父母增加时间,而且如果整个系统由于许多过程而变得缓慢,那么在子流程中不会遇到死亡瘟疫。

你可以通过输入在bash脚本中做到这一点

 ulimit -t X 

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