supervisor 不是 python 包,不能通过 pip install 后直接 import 或调用,而是需系统级安装的独立进程管理工具;pip 安装仅提供 python 模块,缺少 supervisord 二进制文件和配置初始化,且默认无自启动、权限路径受限;推荐 ubuntu/debian 下用 sudo apt install supervisor 直接安装,配置文件置于 /etc/supervisor/conf.d/,修改后须执行 sudo supervisorctl reread && sudo supervisorctl update 生效;python 日志延迟因 stdout 缓冲,应加 -u 参数或显式 flush。

Supervisor 不是 Python 包,不能用 pip install supervisor 后直接 import 或调用——它是个独立的进程管理工具,必须通过系统级安装和配置才能生效。
为什么 pip 安装的 supervisor 无法启动服务?
很多人执行 pip install supervisor 后尝试运行 supervisord,结果报错:command not found 或 No config file found。这是因为:
-
pip安装的是 Python 库(supervisor模块),但真正的守护进程二进制文件supervisord和命令行工具supervisorctl需要由系统包管理器或手动初始化生成 - 即便用
pip install supervisor成功,也需额外执行echo_supervisord_conf > /etc/supervisord.conf初始化配置,且默认不随系统启动 - 在非 root 环境(如普通用户家目录)下,
supervisord默认尝试写入/var/log/等受限路径,会因权限失败
正确安装与初始化配置(Ubuntu/Debian 推荐)
跳过 pip,直接用系统包管理器安装,省去权限和路径陷阱:
- 运行
sudo apt update && sudo apt install supervisor - 配置文件自动生成在
/etc/supervisor/conf.d/目录下,每个项目单独建.conf文件(如myapp.conf) - 示例配置片段(存为
/etc/supervisor/conf.d/myapp.conf):
[program:myapp] command=/usr/bin/python3 /home/user/myapp/app.py directory=/home/user/myapp user=user autostart=true autorestart=true redirect_stderr=true stdout_logfile=/home/user/myapp/logs/supervisor.log
注意:user 必须设为实际运行者(不能是 root,除非必要),stdout_logfile 路径需确保该用户有写权限。
配置生效前必须 reload,且 supervisord 是单实例进程
改完配置不 reload = 白配。常见误操作:
- 只执行
sudo supervisorctl reread—— 这只是重新扫描配置文件,没加载新程序 - 漏掉
sudo supervisorctl update—— 才真正把新增/变更的 program 加入运行队列 - 误以为每次改配置都要
sudo systemctl restart supervisor—— 实际上supervisord自身是常驻进程,update就够了;只有修改主配置/etc/supervisor/supervisord.conf才需重启服务
标准流程就是:sudo supervisorctl reread && sudo supervisorctl update,之后用 sudo supervisorctl status 确认状态。
Python 进程 stdout 缓冲导致日志延迟或丢失
很多 Python 脚本在 supervisor 下“看似没输出”,其实是缓冲惹的祸。原因和解法:
- Python 在非 TTY 环境下默认启用 full-buffering,
print()日志不会实时刷到stdout_logfile - 解决方法一:启动命令加
-u参数,即把command改成/usr/bin/python3 -u /home/user/myapp/app.py - 解决方法二:代码里加
import sys; sys.stdout.reconfigure(line_buffering=True)(Python 3.7+)或print(..., flush=True) - 别依赖
logging的默认 handler —— 它可能仍走缓冲,建议显式指定StreamHandler并设flush=True
这个点不处理,你会反复怀疑 supervisor 没在转发日志,其实它一直在收,只是 Python 拖着不给。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











