有办法干净地杀死乌维克恩吗?
也就是说,如果它在终端的前台运行,我可以在上面键入^C。这将导致uvivorn进程死亡,并且所有的工作进程都将被清理。(也就是说,他们离开了。)
另一方面,如果uvicorn在没有终端的情况下在后台运行,那么我就想不出一种干净地杀死它的方法。它似乎忽略了SIGTERM、SIGINT和SIGHUP。我可以使用SIGKILL (即-9)杀死它,但是工作进程仍然存在,并且我必须跟踪所有的工作进程并杀死它们。这并不理想。
我在RedHatEnterpriseLinuxServer7.3 (Maipo)上使用带有CPython 3.7.4、uvivorn版本0.11.2和FastAPI 0.46.0的uvicorn。
发布于 2020-09-29 23:58:53
这是因为您将uvicorn
作为您唯一的服务器运行。uvicorn
不是流程管理器,因此它不管理员工生命周期。这就是为什么生产他们建议使用gunicorn+UvicornWorker运行uvicorn的原因。
尽管如此,您可以使用下面的脚本杀死生成的工作人员并触发它的关闭:
$ kill $(pgrep -P $uvicorn_pid)
这可以工作,但父pid上的kill
不能工作,原因是当您对某个东西进行^C
处理时,信号会在其所有附加到stdin
的派生进程中传输。
发布于 2022-11-20 09:34:27
lsof -i :8000
这将使用端口:8000检查进程。如果对fastAPI使用不同的端口,则更改端口号。我在fastAPI上使用了邮递员和蟒蛇。所以用python检查进程,然后复制PID (通常是4-5个数字)。
那就跑
kill -9 PID
,其中PID是复制的PID数字。
发布于 2022-02-08 15:15:43
在我的例子中,uvicorn
在pgrep -P
杀死旧进程时成功地生成了新进程,所以我决定立即杀死整个进程组,就像^C
一样:
PID="$(pgrep -f example:app)"
if [[ -n "$PID" ]]
then
PGID="$(ps --no-headers -p $PID -o pgid)"
kill -SIGINT -- -${PGID// /}
fi
每一行解释:
pgrep -f example:app
获取父uvicorn ... example:app
的PID[[ -n "$PID" ]]
检查此PID不为空,以避免在uvicorn
未运行时执行进一步的步骤。ps --no-headers -p $PID -o pgid
获取PGID (Process )这个PID是kill -SIGINT
类似于礼貌的^C
(您可以使用kill -9
进行非礼貌的即时杀戮)--
意味着下一个令牌是位置参数,而不是命名选项,即使它以-
开头。-${PGID
-负值让kill
知道它是PGID,而不是PID。${PGID// /}
移除添加到PGID中的所有空格( ps
)以对齐列。https://stackoverflow.com/questions/60424390
复制相似问题