Python杀死子进程

时间:2018-04-01 20:04:03

标签: python linux

Python 2.7,Ubuntu 16.04

我们购买的专有数学软件包用于计算。我们正在尝试构建一个在运行10秒后杀死该包的子进程的进程。

以下解决方案按预期在10秒后终止do_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)

1 个答案:

答案 0 :(得分:1)

假设solve函数正在做一些你无法改变的讨厌的事情,那么没有简单或干净的方法来做到这一点。

一种可能性是将孩子放在自己的小组中,然后对小组进行核武......但使用multiprocessing进行管理并不容易,而且根据{{1}的方式,它甚至可能不起作用启动孙子。

一种更为简单的方式,但可能更容易和更有可能工作,是手动走孩子的过程树,在杀死孩子之前或之后找到并杀死任何孙子孙女。最简单的方法可能是像psutil这样的第三方库。它看起来像这样:

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()