supervisor 配置关键在路径、权限、用户和通信套接字四点:socket需改至持久路径并设对属主;program需设autostart=true、有效user及directory;日志目录须手动创建且权限匹配;更新配置须先reread再update,勿直接reload。

Supervisor 不是“装完就能用”的工具,配置错一个参数,supervisord 就可能启动失败、进程不拉起、日志写不进文件,甚至 supervisorctl 连不上服务。关键不在装,而在配——尤其是路径、权限、用户和通信套接字这四点。
supervisord 启动失败:先看 socket 路径和权限
最常见的报错是 Connection refused 或 FATAL Exited too quickly,根源往往不是程序本身,而是 supervisord 自己没跑起来。
-
unix_http_server.file默认指向/tmp/supervisor.sock,但很多系统会定时清理/tmp下的文件,导致 socket 消失;必须改成持久路径,比如/var/run/supervisor.sock - 改完路径后,要确保目录存在且属主正确:
sudo mkdir -p /var/run && sudo chown root:root /var/run/supervisor.sock - 如果用
systemctl启动,还要检查/usr/lib/systemd/system/supervisord.service里是否指定了配置文件路径(-c /etc/supervisord.conf),否则它会读默认路径,忽略你改的配置
program 配置不生效:autostart、user 和 directory 缺一不可
写好 [program:xxx] 后,supervisorctl status 显示 NO FILE 或 STARTING 卡住,大概率是这三个参数没对齐。
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
-
autostart=false是默认值,意味着即使supervisord起来了,你的程序也不会自动启动;生产环境建议设为true,调试时可关掉 -
user必须是真实存在的 Linux 用户,且该用户对command中的二进制、脚本、依赖库、日志路径都有执行/读写权限;别用root,除非真有必要 -
directory是工作目录,不是程序路径;如果command里用了相对路径(如./start.sh或gunicorn wsgi:app),没设directory就会找不到文件或模块
日志写不进文件:stdout_logfile 权限和路径得手动手动建
配置写了 stdout_logfile=/var/log/myapp/out.log,但日志始终为空,甚至 supervisorctl tail myapp stdout 报错说文件不存在——这不是 Supervisor 的 bug,是 Linux 文件系统的事。
-
/var/log/myapp/目录必须提前创建,且属主必须和user=xxx一致;Supervisor 不会帮你建目录 - 日志文件不能由 root 创建后 chmod 给其他用户;得用目标用户创建,或用
chown xxx:xxx /var/log/myapp -
redirect_stderr=true可以把 stderr 合并到 stdout 日志,省去维护两个文件;但若需分离排查,就得保留stderr_logfile并确保其路径同样有效
配置更新后进程没变化:reread 和 update 不是同一个动作
改完 .conf 文件,运行 supervisorctl reload 发现状态没变、新进程没加进来,是因为 reload 会杀掉整个 supervisord 进程再重启——这会导致所有托管进程中断。
- 正确流程是两步:
supervisorctl reread(扫描新增/修改的配置文件)→supervisorctl update(按新配置启停对应程序) -
reread只检查语法和路径,不触发任何启停;update才真正对比当前状态与配置差异,只操作变动项 - 如果
update后显示Refused: <name> is already running</name>,说明该 program 已在运行,但配置有变更(比如 command 或 environment 改了),此时需先stop name再start name,或者直接restart name
最常被跳过的一步是确认 supervisord 实际加载的配置路径——用 ps aux | grep supervisord 看启动命令带的 -c 参数,别信文档里写的“默认位置”,不同安装方式(apt/yum/pip)默认路径可能差着一个目录层级。










