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)
答案 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()
。