Dou*_*las 15 python python-3.x fastapi uvicorn
有没有办法干净地杀死 uvicorn?
即,如果它在终端的前台运行,我可以在它上面键入 ^C。这会导致 uvivorn 进程终止,并且所有工作进程都将被清理。(即,他们走开了。)
另一方面,如果 uvicorn 在没有终端的情况下在后台运行,那么我无法想出一种干净地杀死它的方法。它似乎忽略了 SIGTERM、SIGINT 和 SIGHUP。我可以用SIGKILL(即-9)杀死它,但是工作进程仍然存在,我必须跟踪所有工作进程并杀死它们。这并不理想。
我在 Red Hat Enterprise Linux Server 7.3 (Maipo) 上使用带有 CPython 3.7.4、uvivorn 版本 0.11.2 和 FastAPI 0.46.0 的 uvicorn。
小智 10
lsof -i :8000
Run Code Online (Sandbox Code Playgroud)
这将检查使用端口 :8000 的进程。如果您对 fastAPI 使用不同的端口,请更改端口号。我使用 postman 和 python 来实现 fastAPI。因此,使用 python 检查进程,然后复制 PID(通常为 4-5 个数字)。
然后运行
kill -9 PID
Run Code Online (Sandbox Code Playgroud)
其中PID是你复制的PID号
那是因为您uvicorn作为唯一的服务器运行。该uvicorn 不是一个进程管理器,而经如此,它不管理它的工人的生命周期。这就是为什么他们建议使用 gunicorn+UvicornWorker 运行 uvicorn进行生产。
也就是说,您可以使用以下脚本杀死产生的工人并触发其关闭:
$ kill $(pgrep -P $uvicorn_pid)
Run Code Online (Sandbox Code Playgroud)
这有效但kill在父 pid 上无效的原因是,当您执行^C某些操作时,信号会在所有附加到stdin.