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

Posted

技术标签:

【中文标题】有没有办法干净地杀死uvicorn?【英文标题】:Is there a way to kill uvicorn cleanly? 【发布时间】:2020-06-10 22:39:57 【问题描述】:

也就是说,如果它在终端的前台运行,我可以在其中键入 ^C。这会导致 uvivorn 进程终止,并清理所有工作进程。 (即,它们消失了。)

另一方面,如果 uvicorn 在没有终端的情况下在后台运行,那么我无法找到彻底杀死它的方法。它似乎忽略了 SIGTERM、SIGINT 和 SIGHUP。我可以用 SIGKILL(即-9)杀死它,但是工作进程仍然活着,我必须跟踪所有工作进程并将它们也杀死。这并不理想。

我在 Red Hat Enterprise Linux Server 7.3 (Maipo) 上将 uvicorn 与 CPython 3.7.4、uvivorn 版本 0.11.2 和 FastAPI 0.46.0 一起使用。

【问题讨论】:

可能与#364有关,能否解释一下如何在没有终端的情况下在后台运行它,以便我看一下? sigterm 和 sigint 是仅有的 2 个在“收听” @euri10 有很多方法可以在没有终端的情况下在后台运行 uvicorn。一种方法是运行它,然后键入 ^Z 以暂停它。然后键入“bg”在后台继续它。然后在 shell 中键入“exit”以使 shell 和终端消失。或者,您最初可以在命令行末尾使用“&”运行它,并省略 ^Z 和“bg”。 (您仍然需要在 shell 中键入“exit”以使 shell 和终端消失。) @euri10 PS 感谢您对此进行调查! 刚刚测试过,我无法重现,在终端中我运行 uvicorn example:app &! (我正在使用 zsh 所以必须使用 ! 来取消进程,否则我无法退出正在运行的终端)然后我关闭终端并杀死 -15 pidof uvicorn 并且它消失了,如果你有办法重现快乐尝试 嗯,很奇怪!有时事情在不同的外壳下表现不同,但我无法在有问题的计算机上轻松安装 zsh。出于某种原因,这可能是 Red Hat 特有的问题,但如果不给你一个 Docker 映像或其他东西,我将无法重现该问题。或者这可能是我正在运行的特定版本的问题。但由于各种原因,我也不能轻易改变这些。无论如何,感谢您对此进行调查! 【参考方案1】:

那是因为您正在运行 uvicorn 作为您唯一的服务器。 uvicorn 不是流程管理器,因此,它不管理它的工人生命周期。这就是为什么 they recommend running uvicorn using gunicorn+UvicornWorker 用于生产。

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

$ kill $(pgrep -P $uvicorn_pid)

之所以有效,但父 pid 上的 kill 无效,是因为当您 ^C 某事时,信号会在所有附加到 stdin 的衍生进程中传输。

【讨论】:

以上是关于有没有办法干净地杀死uvicorn?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法干净轻松地撤消 git 合并?

有没有办法强行杀死python中的线程?

有没有办法强制 Xcode 机器人进行干净的结帐?

有没有办法非暴力地停止芹菜工人的特定任务?

当用户明确杀死应用程序时,有没有办法调用函数?

有没有办法在应用程序被杀死时接收数据通知?