你好,我有一个写在烧瓶里的网络应用程序,它附在一个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}$我试着给线程作为一种选择,但没有成功。有人能告诉我我哪里出错了吗
更新
使用
sudo
创建两个进程:父进程sudo
和运行实际命令的子进程。大多数信号(包括SIGTERM)都应该从父进程sudo
传递给子进程,但是,在许多情况下,它可能不传递。可能是这样。您需要确保您正在终止子进程。在您应该能够通过直接以根用户身份运行}来避免这个问题。但是,从安全角度来看,最好避免以根用户身份运行
gunicorn
并删除{gunicorn
等服务器进程。java读卡器真的需要它吗?如果有关于打开USB端口的权限问题,有一些方法可以解决。一些想法可以在这里找到:https://unix.stackexchange.com/questions/72437/how-to-grant-non-root-user-access-to-device-filesos.kill()
试图终止一个特权进程(以sudo
开头),但烧瓶进程没有特权。您应该看到错误响应。在尝试
Popen(['sudo', 'kill', pid])
或类似的方法。在如果您没有得到错误响应,服务器可能会阻止
/swipe
请求中的os.waitpid()
,因此在读卡器进程终止之前,/kill_swiper
请求不会得到处理。在相关问题 更多 >
编程相关推荐