Popen之后的杀死进程及其所有子进程

问题描述 投票:0回答:1

因此,我有一个Flask端点A,端点B和另外两个脚本foo.pybar.py

当我呼叫端点A时,我将使用Popen呼叫foo.py并存储其PID。在foo.py上,它使用Popen调用bar.py,然后再次使用Popen进行another调用。在bar.py上打开的进程是一台服务器(更具体地说,它是tf服务服务器),当我执行p.wait()时,它将永远挂起。稍后,我想使用端点B结束由A触发的整个过程。

情况可能类似于:

Flask的端点:

import os
import json
import signal
from subprocess import Popen

from flask import current_app
from flask import request, jsonify

@app.route('/A', methods=['GET'])
def a():
    p = Popen(['python', '-u','./foo.py'])
    current_app.config['FOO_PID'] = p.pid
    return jsonify({'message': 'Started successfully'}), 200

@inspection.route('/B', methods=['GET'])
def b():
    os.kill(current_app.config['FOO_PID'], signal.SIGTERM)
    return jsonify({'message': 'Stopped successfully'}), 200

foo.py:

p = Popen(['python' ,'-u', './bar.py', '--serve'])
while True:
   continue

bar.py:

command = f'tensorflow_model_server --rest_api_port=8501 --model_name=obj_det --model_base_path=./model'
p = subprocess.Popen(command, shell=True, stderr=sys.stderr, stdout=sys.stdout)
p.wait()

[不幸的是,当我使用端点B杀死foo.py时,bar.py(即服务器)创建的过程不会结束。 我如何杀死服务器?

请考虑与操作系统无关的解决方案。

python flask tensorflow-serving
1个回答
0
投票

使用像psutil这样的包,您可以递归地迭代和访问与某个PID相关的所有子进程。这将有效地使您杀死所有嵌套进程。psutilhttps://github.com/giampaolo/psutil的文档。

import json
import signal
from subprocess import Popen

from flask import current_app
from flask import request, jsonify
from psutil import Process

@app.route('/A', methods=['GET'])
def a():
    p = Popen(['python', '-u','./foo.py'])
    current_app.config['FOO_PID'] = p.pid
    return jsonify({'message': 'Started successfully'}), 200

@inspection.route('/B', methods=['GET'])
def b():
   pid = current_app.config['FOO_PID']
   parent = Process(pid)
   for child in parent.children(recursive=True):
      child.kill()
   parent.kill()
   return jsonify({'message': 'Stopped successfully'}), 200
© www.soinside.com 2019 - 2024. All rights reserved.