supervisor配置必须显式设置autostart=true和autorestart=true,否则进程崩溃不会自动重启;需禁用web服务自身守护模式、正确处理sigterm信号,并启用stopasgroup/killasgroup防止子进程残留。

Supervisor配置文件里必须设置autostart和autorestart
很多用户以为只要把Web服务(比如gunicorn或uvicorn)加进Supervisor就自动兜底了,其实不是。默认autostart=false且autorestart=unexpected,这意味着进程崩溃时不会重启——除非它退出码不在预设“正常”列表里。
正确做法是显式声明:
[program:myweb] command=/path/to/venv/bin/gunicorn app:app --bind 127.0.0.1:8000 directory=/opt/myweb user=www-data autostart=true autorestart=true startretries=3 exitcodes=0,2
-
autorestart=true是关键,等价于autorestart=always,确保任何退出都触发重启 -
startretries=3防止启动失败时无限拉起,避免夯住系统资源 -
exitcodes=0,2明确哪些退出码算“正常”,其余全视为异常——注意:Python脚本因未捕获异常退出时通常是1,必须不在此列表中
用supervisorctl验证进程状态和日志路径
配置写完不等于生效。常见错误是改了supervisord.conf但没重载,或者程序名拼错导致supervisorctl status里压根不显示。
执行以下三步确认真实运行态:
- 运行
supervisorctl reread加载新配置 - 运行
supervisorctl update启动新增/变更的程序 - 运行
supervisorctl status查看是否为RUNNING,不是则用supervisorctl start myweb手动启一次
如果仍失败,直接查日志:supervisorctl tail -f myweb stderr。别去翻/var/log/supervisor/下的文件——那些是Supervisor自身日志,不是你的Web进程输出。
Python Web服务需禁用自身守护进程模式
像gunicorn默认带--daemon选项,或Flask用debug=True启动时会fork子进程,这和Supervisor的进程管理模型冲突。Supervisor只监控直系子进程,一旦被daemonize,它就失去控制权,崩溃后无法感知、无法重启。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
务必在command中关闭这些行为:
- gunicorn:去掉
--daemon,加--preload(避免worker fork时加载两次Python模块) -
uvicorn:加
--workers 1 --loop auto,禁用--daemon(它本身不支持,但有人误加nohup包裹) - 任何自研脚本:删掉
os.fork()、daemonize逻辑,也不要用atexit注册非必要清理——Supervisor会发SIGTERM,Python能正常响应
信号传递和优雅退出必须由Python代码配合
Supervisor发SIGTERM给主进程后,默认等待10秒(可配stopwaitsecs)再强杀。如果你的Web服务没处理这个信号,会立刻中断请求、丢数据。
以uvicorn为例,它原生支持SIGTERM,但gunicorn需要额外钩子:
def when_ready(server):
import signal
def graceful_shutdown(signum, frame):
server.stop()
signal.signal(signal.SIGTERM, graceful_shutdown)
更简单的方式是用gunicorn内置参数:--graceful-timeout 30 --timeout 60,让它自己处理平滑下线。关键是——Python代码不能忽略SIGTERM,也不能在finally块里做耗时操作(比如同步写磁盘),否则超时后会被Supervisor暴力SIGKILL。
真正容易被忽略的是:Supervisor的stopasgroup=true和killasgroup=true必须开启,否则多进程Web服务(如gunicorn worker)里的子进程可能残留,下次启动时报端口占用。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










