别再使用kill -9了!!!别再使用kill -9了!!!别再使用kill -9了!!!
事情的起因是这样:
最新给FastAPI增加定时任务,使用APScheduler模口来控制。并在app的life_span中启动任务调度器,那么应该在app关闭时也销毁调度器。我使用Gunicorn来管理uvicorn的进程。要重启时使用
bash
kill -9 [pid]
发现任务调度器并没有正确销毁退出,也就是FastAPI的life_span函数yield的结束逻辑没有被执行。
原因是kill -9强制退出进程,uvicorn来不及释放资源。
优雅的方案
你如果这用启动FastAPI应用程序:
bash
gunicorn -D -w 1 -k uvicorn.workers.UvicornWorker main:app --bind 127.0.0.1:8000
可以使用如下命令查看gunicorn进程:
bash
# 列出详细信息,包括PID和管理的端口号
ps aux | grep gunicorn
# 列出PID和名称
pgrep -f gunicorn -l
那么停止时,别再使用kill -9了,使用如下命令:
bash
# 关闭使用8000端口的gunicorn
pkill -f "gunicorn.*8000"
# 也可以不加引号
pkill -f gunicorn.*8000
Gunicorn会等待uvicorn停止并释放资源,执行完FastAPI的停止逻辑后,才最终停止。
PS:
如果最终实在无法关闭,才使用kill -9 强制结束。