容器停止时 docker stop 发的是 SIGTERM,但收到它的是 1 号进程。如果 1 号进程是 sh 而不是 gunicorn,优雅关闭就根本没有机会发生。这篇用本机的真实进程模拟这件事:被发信号的进程分别是 gunicorn 本身还是外面包着的 sh。需要说明:没有真正的 Docker 容器(拉不到基础镜像),也不是 Linux,所以 1 号进程的特殊信号语义没有验证(Dockerfile 的写法见第 178 篇,优雅关闭见第 180 篇)。
启动方式 被发信号的进程就是 gunicorn? 它的退出 请求结果 gunicorn 变孤儿继续运行? exec 形式:直接运行 gunicorn(CMD ["gunicorn", ...]) True 2.56 s 200 3.01 s False shell 形式,单条命令:sh -c "gunicorn ..." True 2.59 s 200 3.01 s False shell 形式,多条命令:sh -c "gunicorn ...; echo done" True 0.0 s 200 3.01 s True 入口脚本最后一行是 gunicorn(没有 exec) False 0.0 s 200 3.01 s True 入口脚本最后一行是 exec gunicorn True 2.72 s 200 3.01 s False
上一篇:数据库连接健康检查;下一篇:Flask 应用启动耗时。
实验在 macOS 上用 /bin/sh(bash 3.2)与真实的 gunicorn 进程完成,没有使用 Docker。
再跑一次 sh -c "...; echo done":sh 退出后 gunicorn 孤儿存在 = True
SIGTERM 之后 1.5 秒补 SIGKILL:请求 → RemoteDisconnected,2.02 s 后(这个请求本来要 3 秒才完成,被打断)