首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有办法干净地杀死乌维克恩吗?

有办法干净地杀死乌维克恩吗?
EN

Stack Overflow用户
提问于 2020-02-27 00:01:38
回答 3查看 17K关注 0票数 21

有办法干净地杀死乌维克恩吗?

也就是说,如果它在终端的前台运行,我可以在上面键入^C。这将导致uvivorn进程死亡,并且所有的工作进程都将被清理。(也就是说,他们离开了。)

另一方面,如果uvicorn在没有终端的情况下在后台运行,那么我就想不出一种干净地杀死它的方法。它似乎忽略了SIGTERM、SIGINT和SIGHUP。我可以使用SIGKILL (即-9)杀死它,但是工作进程仍然存在,并且我必须跟踪所有的工作进程并杀死它们。这并不理想。

我在RedHatEnterpriseLinuxServer7.3 (Maipo)上使用带有CPython 3.7.4、uvivorn版本0.11.2和FastAPI 0.46.0的uvicorn。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-09-29 23:58:53

这是因为您将uvicorn作为您唯一的服务器运行。uvicorn 不是流程管理器,因此它不管理员工生命周期。这就是为什么生产他们建议使用gunicorn+UvicornWorker运行uvicorn的原因。

尽管如此,您可以使用下面的脚本杀死生成的工作人员并触发它的关闭:

代码语言:javascript
运行
复制
$ kill $(pgrep -P $uvicorn_pid)

这可以工作,但父pid上的kill不能工作,原因是当您对某个东西进行^C处理时,信号会在其所有附加到stdin的派生进程中传输。

票数 12
EN

Stack Overflow用户

发布于 2022-11-20 09:34:27

代码语言:javascript
运行
复制
lsof -i :8000

这将使用端口:8000检查进程。如果对fastAPI使用不同的端口,则更改端口号。我在fastAPI上使用了邮递员和蟒蛇。所以用python检查进程,然后复制PID (通常是4-5个数字)。

那就跑

代码语言:javascript
运行
复制
kill -9 PID

,其中PID是复制的PID数字。

票数 0
EN

Stack Overflow用户

发布于 2022-02-08 15:15:43

在我的例子中,uvicornpgrep -P杀死旧进程时成功地生成了新进程,所以我决定立即杀死整个进程组,就像^C一样:

代码语言:javascript
运行
复制
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 )以对齐列。
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60424390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档