Python终止子进程
Python 2.7、Ubuntu 16.04 我们购买了一个专有的数学软件包,用于计算。我们正在尝试构建一个进程,该进程在运行10秒后终止该包的子进程 下面的解决方案在10秒后按预期终止Python终止子进程,python,linux,Python,Linux,Python 2.7、Ubuntu 16.04 我们购买了一个专有的数学软件包,用于计算。我们正在尝试构建一个进程,该进程在运行10秒后终止该包的子进程 下面的解决方案在10秒后按预期终止do\u math()函数。但是,solve会启动一个子进程,它有自己的pid。因此,执行ps aux显示它以自己的名称运行,而不是以python名称运行 有没有任何方法可以跟踪并杀死python中以这种方式启动的pid def do_math(): status = solve() #launches
do\u math()
函数。但是,solve
会启动一个子进程,它有自己的pid。因此,执行ps aux
显示它以自己的名称运行,而不是以python
名称运行
有没有任何方法可以跟踪并杀死python中以这种方式启动的pid
def do_math():
status = solve() #launches the package
#Start function as a process
k = multiprocessing.Process(target=do_math)
k.start()
# Wait for 10 seconds or until process finishes
k.join(10)
# If thread is still active
if k.is_alive():
print k.pid
os.kill(k.pid, signal.SIGINT)
假设
solve
函数正在做一些您无法更改的讨厌的事情,那么没有简单或干净的方法可以做到这一点
一种可能是在自己的组中生成子组,然后对该组进行核攻击……但使用多处理
进行管理并不容易,而且它甚至可能不起作用,这取决于求解
如何启动子组
一种更为骇客的方法,可能更容易也更容易操作,就是手动遍历孩子的进程树,在杀死孩子之前或之后找到并杀死任何孙子。实现这一点的最简单方法可能是使用类似的第三方库。它看起来像这样:
# Shortly after launching k
p = psutil.Process(k.pid)
# Later, right before killing k
for child in p.children():
p.send_signal(signal.SIGINT)
如果你想在孩子死后杀死他们(我想你发送的是
SIGINT
,而不是SIGTERM
,这可能很重要),那么你应该复制p.children()
先杀k
如果没有答案,任何方向性的建议都是值得赞赏的。杀死一个生了自己孩子的孩子会使这些孙子成为孤儿。(我认为这在文档中有解释。)根据solve
中的子代码是如何设计的,这可能意味着一些不同的事情,但没有一件事情是你可以轻松解决的,而不必在杀死孩子之前通过流程树找到孙子。还有一件事:如果你购买了这个软件包,它肯定会得到一些支持吗?您是否尝试过询问他们终止解决方案的建议方法?或者要求他们添加一个,如果他们从来没有想过的话?是的,我们尝试过:(是的,必须这样做,因为solve
函数就像你说的那样非常糟糕。你的答案应该是p.kill()
而不是p.kill(signal.SIGINT)
但是,我在运行它的时候发现了一个太多的args错误,里面有SIGINT
?@HoosierCoder是的,我忘记了kill
没有参数。但是如果你有一个很好的理由发送SIGINT,你不想只发送SIGKILL,因为它恰好是默认的。使用psutil
的文档非常好(包括杀死一整棵树上的孩子、优雅地杀死一个SIGKILL然后等待SIGKILL等等的食谱。);不要只是盲目地用枪射击,而不是看。你应该从答案中取出信号.SIGINT
,这样就不会让任何人读到它了吗?@HoosierCoder我已经把它改为使用发送信号
,希望任何有这个问题的人,看到这个问题试图发送SIGINT的人都会看到answ如果他们想发送SIGKILL或SIGTERM,er也会做同样的事情。哦,我明白了。很好