根本原因是默认配置将socket文件放在/tmp目录,而Linux系统会定期清理/tmp导致文件丢失;必须将unix_http_server.file、logfile和pidfile均改为/var/run/或/var/log/等持久路径并确保目录权限正确。

Supervisor 能用,但默认配置在 /tmp 下极易失效,不改 socket 路径和日志目录,supervisorctl 连不上是常态。
为什么 supervisorctl 总报 “Connection refused” 或 “No such file”
根本原因不是没启动服务,而是 unix_http_server.file 默认指向 /tmp/supervisor.sock —— 多数 Linux 发行版会定期清理 /tmp,哪怕服务跑着,socket 文件也可能被删。systemd 重启后更大概率丢失。
- 检查当前配置的 socket 路径:
grep "file=" /etc/supervisord.conf - 必须改成持久路径,例如:
file=/var/run/supervisor.sock - 同时确保目录存在且权限正确:
sudo mkdir -p /var/run/supervisor && sudo chown root:root /var/run/supervisor - 如果用 systemd 管理,还要确认
/usr/lib/systemd/system/supervisord.service中的RuntimeDirectory=supervisor已启用(CentOS/RHEL 默认有,Ubuntu 可能需手动加)
supervisord.conf 必须调整的三项配置
仅靠 echo_supervisord_conf 生成的默认配置无法直接用于生产。以下三处不改,后续所有进程都可能静默失败:
-
[unix_http_server]段:把file=改为/var/run/supervisor.sock,并追加chmod=0700和chown=root:root -
[supervisord]段:把logfile=改为绝对路径如/var/log/supervisord.log,避免写入失败;pidfile=同理设为/var/run/supervisord.pid -
[include]段:在文件末尾手动添加,指向子配置目录,例如:[include] files = /etc/supervisor/conf.d/*.conf
然后创建该目录:sudo mkdir -p /etc/supervisor/conf.d
写一个能真正跑起来的 .conf 子配置文件
别直接往主配置里塞 [program:x] —— 难维护、易冲突、reload 时容易漏加载。子配置才是标准做法,且注意这些细节:
- 命令必须写全路径:
command=/usr/bin/python3 /opt/myapp/main.py,不能只写python3 main.py -
directory=必须存在,且 supervisord 进程有读取权限;若用user=指定非 root 用户,该用户还必须对日志路径有写权限 - 日志路径要提前建好并授权,例如:
sudo mkdir -p /var/log/myapp && sudo chown myuser:myuser /var/log/myapp - 关键开关别设错:
autostart=true(开机即启)、autorestart=unexpected(只在非正常退出时重启,避免无限崩溃循环) - 示例最小可用配置:
[program:myworker] command=/usr/bin/python3 /opt/myapp/worker.py directory=/opt/myapp user=myuser autostart=true autorestart=unexpected startsecs=5 stderr_logfile=/var/log/myapp/worker.err.log stdout_logfile=/var/log/myapp/worker.out.log
验证与调试最有效的三步
装完配完别急着 start,先走通这三步,90% 的“不生效”问题当场定位:
- 语法检查:
sudo supervisorctl -c /etc/supervisord.conf reread—— 若报错,说明子配置有语法问题(比如漏了=、用了中文标点) - 加载确认:
sudo supervisorctl -c /etc/supervisord.conf avail—— 应该列出你刚写的 program 名,否则 include 路径或文件后缀不对(必须是.conf或.ini,且文件权限不能是 600) - 启动试跑:
sudo supervisorctl -c /etc/supervisord.conf start myworker,再立刻tail -f /var/log/myapp/worker.out.log看输出,比status更真实
最容易被忽略的是:子配置文件名必须以 .conf 结尾,且不能包含空格或特殊字符;supervisord 进程本身不会自动重载新增的子配置,每次改完都要 reread + update。


















