Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python终止子进程_Python_Linux - Fatal编程技术网

Python终止子进程

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

Python 2.7、Ubuntu 16.04

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

下面的解决方案在10秒后按预期终止
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也会做同样的事情。哦,我明白了。很好