supervisord 启动后 supervisorctl 连不上,主因是未启用 inet_http_server 或 unix socket 权限错误;需检查配置中 [inet_http_server] 或 [unix_http_server] 设置,并确保 supervisorctl 的 serverurl 匹配。

supervisor 不是 systemd 的替代品,它只做进程守护,不处理系统级依赖或开机启动顺序;用错场景反而会让服务更难排查。
为什么 supervisord 启动后 supervisorctl 连不上?
最常见原因是配置里没开 inet_http_server 或 Unix socket 权限不对。默认配置通常禁用 HTTP 接口,而 supervisorctl 默认走 TCP(http://localhost:9001)。
- 检查
/etc/supervisor/conf.d/*.conf里是否包含[inet_http_server]段,且port和username/password已设置 - 若改用 Unix socket(更安全),需在
[unix_http_server]中确认file路径(如/var/run/supervisor.sock),并确保supervisorctl配置里的serverurl指向unix:///var/run/supervisor.sock - 运行
supervisord -c /etc/supervisor/conf.d/supervisord.conf手动启动时加-n参数可前台输出日志,快速定位 bind 失败或权限拒绝问题
supervisorctl start xxx 报错 “ERROR (no such process)” 怎么办?
不是进程名写错了,就是配置没加载。supervisor 不会自动扫描新增的 conf 文件,必须显式重载。
- 确认你的程序配置文件放在
/etc/supervisor/conf.d/下,且后缀为.conf(比如myapp.conf) - 执行
supervisorctl reread让 supervisor 发现新配置,再执行supervisorctl add myapp(如果未自动添加) - 注意:仅
reread不会重启已有进程;要应用变更(比如改了command),得再执行supervisorctl update - 用
supervisorctl status查看当前已知进程列表,名字取自配置中[program:xxx]的xxx,不是二进制名或脚本名
Python Web 服务(如 Flask/uWSGI)用 supervisor 启动失败的典型原因
根本问题是工作目录、环境变量和用户权限没对齐,不是“supervisor 不支持 Python”。
-
directory必须设成项目根目录(含venv或requirements.txt的路径),否则import报错 -
environment要显式传入PYTHONPATH、PATH(尤其当用虚拟环境时:PATH="/opt/myapp/venv/bin:%(ENV_PATH)s") - 避免用
user=root启动 Web 服务;换用专用用户(如www-data)后,要同步检查日志路径、socket 文件路径的写权限 - uWSGI 常因
--master和 supervisor 的进程管理冲突而反复重启,建议关掉 uWSGI master(加--disable-logging --master=false),让 supervisor 全权负责启停
supervisor 的 reload 机制不触发进程 graceful shutdown,SIGTERM 后等待时间由 stopwaitsecs 控制,默认 10 秒——如果你的服务需要 30 秒清理连接,这个值必须手动调大,否则会被强制 kill。










