根本原因是Supervisor不加载用户shell环境,需用绝对路径调用Python解释器并显式配置environment;Flask不可启用debug=True,应关闭调试或改用gunicorn;日志路径须绝对化且可写,autorestart需配合startsecs=10防误判。

Supervisor 启动 Flask 进程时提示 command not found 怎么办
根本原因通常是 Supervisor 的环境变量和你手动执行时不同,它默认不加载用户的 shell 配置(如 ~/.bashrc 或 ~/.profile),导致 flask 命令或 Python 脚本路径找不到。
- 用绝对路径调用 Python 解释器:比如把
command=flask run --host=0.0.0.0:5000改成command=/opt/venv/bin/python /opt/myapp/app.py - 显式指定
environment,补全PYTHONPATH和PATH:[program:myflask] command=/opt/venv/bin/python /opt/myapp/app.py directory=/opt/myapp environment=PATH="/opt/venv/bin",PYTHONPATH="/opt/myapp"
- 确认
user配置项权限足够——别用root启动但让普通用户写日志目录,否则会静默失败
Flask 开发模式(debug=True)能不能交给 Supervisor 管理
不能。Supervisor 是进程管理器,不是调试工具;而 debug=True 会启用重载器(reloader),它通过 fork 子进程监听文件变化,与 Supervisor 的子进程管控逻辑冲突,大概率导致反复重启、端口占用或 Address already in use 错误。
- 部署时必须关闭 debug:
app.run(debug=False),或用if os.environ.get('FLASK_ENV') != 'development': app.run(...) - 若需热重载,应改用
gunicorn+--reload,再由 Supervisor 管理 gunicorn 进程,而不是直接跑flask run - Supervisor 自带的
autorestart=true是为崩溃恢复设计的,不是替代代码热更的方案
为什么 Supervisor 日志里只看到 Starting server on http://... 就没后续了
这是 Flask 默认使用单线程阻塞式 WSGI 服务器(Werkzeug),启动后就卡在 app.run() 上不返回,而 Supervisor 误判为“进程未真正启动”,触发超时或状态异常。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 加
startsecs=10给足启动等待时间,避免被误杀:startsecs=10 - 更稳妥的做法是换用生产级服务器,比如
gunicorn:command=/opt/venv/bin/gunicorn -w 2 -b 0.0.0.0:5000 app:app
- 确保
stdout_logfile和stderr_logfile路径存在且可写,否则日志会静默丢失,看起来像“没输出”
多个 Flask 应用共存时,如何避免端口冲突和配置污染
Supervisor 不自动隔离环境,所有 program 共享同一份全局环境变量,容易因 FLASK_APP、FLASK_ENV 等变量互相干扰。
立即学习“Python免费学习笔记(深入)”;
- 每个
[program:x]段内单独设environment,例如:environment=FLASK_APP="app1:app",FLASK_ENV="production"
- 不同应用绑定不同端口,并在
command中显式指定,不要依赖默认的5000 - 用
process_name=%(program_name)s_%(process_num)02d配合numprocs=1明确命名,避免supervisorctl status输出混淆

















