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