【问题标题】:Gunicorn not able to kill an external processGunicorn 无法杀死外部进程
【发布时间】:2018-03-31 20:56:05
【问题描述】:

您好,我有一个用 Flask 编写的 Web 应用程序,它连接到 USB 信用卡刷卡器。 swiper 的代码是用 java 编写的,我的烧瓶应用程序是这样的

@app.route("/swipe")
def index():
    a = Popen(["sudo", "java", "sample"], shell=False)
    sts2 = os.waitpid(p.pid, 0)
    return "hello"


@app.route("/kill_swiper", methods=["POST"])
def index_2():
    try:
        pid = request.json
        pid = pid.get("pid")
        os.kill(int(pid), signal.SIGTERM)
        return Response(json.dumps({"status": True}), status=200, mimetype='application/json')

    except Exception as e:
        print(e)
        return Response(json.dumps({"status": False}),
                        status=417, mimetype='application/json')


if __name__ == '__main__':
    app.config['TEMPLATES_AUTO_RELOAD'] = True
    app.run(host="0.0.0.0")

每当用户单击按钮时,都会触发刷卡器,将他重定向到他可以刷卡或单击取消的页面。

谈到我的问题,我可以通过运行命令从外部杀死 swiper

sudo kill <pid of swiper>

但是当我尝试点击网站上的取消按钮时,它并没有被杀死。我在 gunicorn 后面运行烧瓶应用程序,我正在使用以下命令运行 gunicorn

sudo gunicorn --bind 0.0.0.0:5000 --workers 3 app:app

我尝试提供线程作为选项,但它不起作用。谁能告诉我哪里出错了

【问题讨论】:

    标签: python python-3.x flask gunicorn


    【解决方案1】:

    更新

    使用sudo创建两个进程;一个父 sudo 进程和一个运行实际命令的子进程。大多数信号(包括 SIGTERM)应该从父进程 sudo 传递给子进程,但是,在各种情况下它可能不会。可能正在发生这种情况。您需要确保您正在杀死子进程。

    您应该能够通过直接以 root 身份运行 gunicorn 并删除 sudo 来规避此问题。但是,从安全的角度来看,最好避免以 root 身份运行诸如 gunicorn 之类的服务器进程。 java读卡器真的需要吗?如果 USB 端口的开放存在权限问题,有办法解决。一些想法可以在这里找到:https://unix.stackexchange.com/questions/72437/how-to-grant-non-root-user-access-to-device-files


    os.kill() 试图杀死一个特权进程(以sudo 开头),但烧瓶进程没有特权。您应该会看到错误响应。

    试试Popen(['sudo', 'kill', pid]) 或类似的。

    如果您没有收到错误响应,则服务器可能会阻止 /swipe 请求中的 os.waitpid(),因此在读卡器进程终止之前不会处理 /kill_swiper 请求。

    【讨论】:

    • 感谢您的回答,但一切都以 sudo 运行。我也试过你的答案,但没有运气。不过,我能够获取 PID 并使用在不同端口上运行的另一个烧瓶进程将其杀死。我也试过像这样运行 gunicorn gunicorn --bind 0.0.0.0:5000 --workers 3 -u root -g root app:app
    • 有没有比os.waitpid()更好的办法
    • 您可以使用p.wait(),但这将与os.waitpid() 相同,虽然更简洁一些。
    • 谢谢@mhawke,我会试试的
    • 老兄,你太神奇了,我终于搞定了。非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 2015-06-08
    • 2015-06-01
    • 2016-07-13
    • 1970-01-01
    • 2015-01-06
    • 2018-05-07
    相关资源
    最近更新 更多