我有一个python应用程序(并行)产生子进程(主要是bash脚本)。某些脚本可能会调用其他脚本。我正在尝试找出处理应用程序和子进程的终止边缘情况的最佳方法。
如果应用程序需要退出或收到SIGTERM
,那么它应终止(SIGTERM
,wait
,SIGKILL
)所有子进程及其创建的任何进程。对此的一种方法是作为新的进程组启动并作为终止的一部分终止进程组(killpg
)。
如果任何子进程花费的时间超过指定的时间,我想杀死它们以及它们创建的子进程。这里的一种方法是将应用程序设置为进程组负责人,这样我就可以杀死该组并依赖它来杀死任何其他子进程。
难以理解的是,这两个解决方案相互冲突,所以我似乎只能满足一个要求。
所以,最后的想法是使用tcsetpgrp,但我并不过分熟悉它。所以,像模拟交互式终端。这意味着杀死应用程序会向所有进程发送SIGHUP
(我认为),并且我可以使用进程组来管理花费太长时间的杀死子进程。
这是一个好主意,还是我还缺少其他任何建议?
奖金部分:
如果应用程序是通过SIGKILL
被杀死的(在这个应用程序中偶尔需要它,是的,我知道应该避免使用SIGKILL
等等),将子进程杀死也是很了不起与bash在退出时向其进程发送SIGHUP
的方式相同。
答案 0 :(得分:0)
使脚本自行终止的可能性。
Perl有一个可以设置闹钟的构造。
这个网站上的好例子:
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秒数。但请注意,在大多数系统中,它是单行道。一个过程不能增加它自己的限制。