Linux 应用程序终止,多个嵌套子进程

Linux 应用程序终止,多个嵌套子进程,linux,process,operating-system,signals,subprocess,Linux,Process,Operating System,Signals,Subprocess,我有一个python应用程序,它(并行)生成子进程(主要是bash脚本)。某些脚本可能会调用其他脚本。我正在努力找出处理应用程序和子流程的终止边缘情况的最佳方法 如果应用程序需要退出,或收到SIGTERM,则应终止(SIGTERM,wait,SIGKILL)所有子进程及其创建的任何进程。实现这一点的一种方法是作为新流程组启动,并作为终止的一部分终止该流程组(killpg) 如果任何子进程花费的时间超过了指定的时间,我想杀死它们以及它们创建的子进程。这里的一种方法是将应用程序设置为进程组负责人,这

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

如果应用程序需要退出,或收到
SIGTERM
,则应终止(
SIGTERM
wait
SIGKILL
)所有子进程及其创建的任何进程。实现这一点的一种方法是作为新流程组启动,并作为终止的一部分终止该流程组(
killpg

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

困难的是这两个解决方案相互冲突,因此我似乎只能满足一个需求

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

这是个好主意,还是我没有其他建议

奖金部分:
如果应用程序是通过
SIGKILL
终止的(在这个应用程序中偶尔需要它,是的,我知道应该避免
SIGKILL
,等等),如果子进程也被终止,那将是一件令人惊奇的事情,就像bash在退出时向其进程发送一个SIGHUP一样。

一种可能使脚本自动终止

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

这是一个很好的例子:

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

搜索python报警超时脚本时也会遇到类似的问题

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

这有一个副作用(优势或缺陷…),即只要子进程的超时时间比父进程短,那么父进程就可以正常恢复

不过,最好是通过CPU时间而不是墙时间来限制进程。通过这种方式,远缘后代不会占用父进程的时间,如果由于许多进程而导致整个系统运行缓慢,那么子进程中就不会出现死亡瘟疫

您可以在bash脚本中通过输入

ulimit -t X 

其中x是所需的cpu秒数。但是请注意,在大多数系统中,这是一条单行道。进程不能增加自身的限制。

如果可以杀死单个子进程(使用os.setsid创建)及其所有子进程,那么要杀死应用程序生成的所有子进程,可以使用for循环。我没有看到冲突。人力资源管理,我忘了可选奖金部分。所以这对SIGTERM来说绝对有效。然而,我仍然想深入研究一个即使是SIGKILL也会在退出时杀死这些子进程的世界。您找到了一个很好的解决方案吗?我的python程序也有同样的问题。