supervisor配置中program段command必须用绝对路径且禁用flask debug模式。需设directory为项目根目录,virtualenv需指定完整python路径;autorestart=true须配startsecs=5防假启动;修改配置后先reread再update。

Supervisor配置文件里program段必须指定绝对路径
Flask应用启动失败却没报错,十有八九是command里用了相对路径。Supervisor不继承你的shell环境,它默认工作目录是/,所以command=python app.py会直接报No such file or directory。
-
command必须写成command=/usr/bin/python3 /opt/myapp/app.py(用which python3确认解释器路径) -
directory设为项目根目录,比如directory=/opt/myapp,否则import可能找不到模块 - 如果用virtualenv,别只写
python,得用/opt/myapp/venv/bin/python
Flask不能用debug=True模式跑在Supervisor里
Supervisor本身是进程管理器,而Flask的debug模式会启用重载器(reloader),它会fork子进程、监听文件变化——这和Supervisor的进程生命周期控制冲突,导致supervisorctl status显示STARTING后一直卡住,或反复重启。
- 确保Flask启动代码里没有
debug=True,例如app.run(host='0.0.0.0:5000', debug=False) - 生产环境建议用
gunicorn或waitress代替app.run(),但即使如此,Supervisor的autorestart=true仍能接管崩溃重启 - 若临时调试需要日志,改用
logging.basicConfig(level=logging.INFO),别依赖debug模式的彩色输出
autorestart和startsecs配合才能防“假启动”
有些Flask应用启动时快速打印日志就退出(比如配置加载失败、数据库连不上),Supervisor若只看进程是否起来,会误判为成功,结果服务根本没真正就绪。
- 设
autorestart=true让崩溃后自动拉起 - 必须配
startsecs=5(默认1秒),表示进程要连续存活满5秒才算启动成功;否则刚fork出来就崩掉,Supervisor也认为OK - 加
startretries=3避免无限重启拖垮系统 - 日志路径建议用绝对路径:
stdout_logfile=/var/log/myapp/access.log,不然日志会丢
reload配置后supervisorctl不生效?先检查reread再update
改完/etc/supervisor/conf.d/myapp.conf,直接supervisorctl restart myapp大概率报ERROR (no such process)——因为Supervisor还不知道这个新program。
- 执行
supervisorctl reread:重新扫描conf目录,识别新增/修改的配置 - 再执行
supervisorctl update:把新配置加载进运行时,此时才会创建对应process - 最后
supervisorctl status确认状态是RUNNING,不是STARTING或BACKOFF - 如果status里出现
BACKOFF,说明启动失败了三次以上,立刻查stderr_logfile里的错误堆栈
stderr_logfile和startsecs才是你最该盯住的两个点。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











