Gunicorn无法终止外部进程

2024-09-29 23:26:23 发布

您现在位置:Python中文网/ 问答频道 /正文

你好,我有一个写在烧瓶里的网络应用程序,它附在一个USB信用卡刷卡器上。swiper的代码是用java编写的,我的flask应用程序是这样的

@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后面运行flask应用程序,并使用以下命令运行gunicorn

^{pr2}$

我试着给线程作为一种选择,但没有成功。有人能告诉我我哪里出错了吗


Tags: jsonfalseapp应用程序flaskindexreturndef
1条回答
网友
1楼 · 发布于 2024-09-29 23:26:23

更新

使用sudo创建两个进程:父进程sudo和运行实际命令的子进程。大多数信号(包括SIGTERM)都应该从父进程sudo传递给子进程,但是,在许多情况下,它可能不传递。可能是这样。您需要确保您正在终止子进程。在

您应该能够通过直接以根用户身份运行gunicorn并删除{}来避免这个问题。但是,从安全角度来看,最好避免以根用户身份运行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请求不会得到处理。在

相关问题 更多 >

    热门问题