有没有办法干净地杀死 uvicorn?

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号


Gus*_*oto 7

那是因为您uvicorn作为唯一的服务器运行。该uvicorn 不是一个进程管理器,而经如此,它不管理它的工人的生命周期。这就是为什么他们建议使用 gunicorn+UvicornWorker 运行 uvicorn进行生产。

也就是说,您可以使用以下脚本杀死产生的工人并触发其关闭:

$ kill $(pgrep -P $uvicorn_pid)
Run Code Online (Sandbox Code Playgroud)

这有效但kill在父 pid 上无效的原因是,当您执行^C某些操作时,信号会在所有附加到stdin.