supervisor默认配置易失败:/tmp下sock和日志被系统清理导致连接失败;user切换引发环境隔离问题;autorestart因startsecs和exitcodes设置不当不生效;systemd与原生启动方式混用致配置未加载。

Supervisor 能让服务崩溃后自动拉起,但直接 yum install supervisor 或 pip install supervisor 后不改配置就跑,大概率会失败——日志被删、socket 文件消失、子进程启动即退出,都是常见结果。
supervisord 启动失败:检查 /tmp 下的 sock 和日志是否被系统清理
默认配置把 supervisor.sock 和主日志放在 /tmp,而多数 Linux 发行版(尤其是 systemd 系统)会在重启或定时清理时清空 /tmp,导致 supervisorctl 连不上 supervisord,报错类似:unix:///tmp/supervisor.sock no such file 或 connection refused。
- 把
[unix_http_server]节里的file=改成持久路径,例如file=/var/run/supervisor.sock - 确保目录存在且权限正确:
sudo mkdir -p /var/run/supervisor && sudo chown root:root /var/run/supervisor - 同步修改
[supervisord]节的logfile=,比如设为/var/log/supervisor/supervisord.log,并创建对应目录:sudo mkdir -p /var/log/supervisor && sudo chown root:root /var/log/supervisor
program 配置后进程不启动:注意 user、directory 和 environment 的实际生效条件
很多脚本在 root 下能跑,但加了 user=www-data 或 user=nobody 就卡住不动,或者提示 Permission denied、No module named xxx。这不是 Supervisor 本身的问题,而是环境隔离导致的。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
user=指定后,command会以该用户身份执行,PATH、HOME、Python 环境都随之切换——用python3前最好写绝对路径,比如/usr/bin/python3 -
directory=必须是该用户有读+执行权限的目录,否则cd失败,相对路径的脚本就找不到 -
environment=中不能用 shell 变量展开,比如PATH=$PATH:/opt/bin无效;要写死,如PATH="/usr/local/bin:/usr/bin:/bin" - 如果程序依赖虚拟环境,别只写
python script.py,应改为/path/to/venv/bin/python script.py
autorestart=true 不生效:关键看 startsecs 和 exitcodes
Supervisor 默认只对“运行满 1 秒后异常退出”的进程才触发重启。如果你的程序启动几毫秒就崩了(比如配置文件错误、端口被占),它会被判定为“启动失败”,不会进自动重启流程,status 里显示 STARTING → BACKOFF → STOPPED。
- 调低
startsecs=1(最小可设为 0,但不推荐),让快速失败也能进入重启队列 - 确认
exitcodes=0,2是否覆盖了你的程序正常退出码;如果程序习惯用非 0 码退出(如 1 表示成功重载),需显式加入,否则会被当异常 -
autostart=true和autorestart=true是两回事:前者控制开机是否拉起,后者控制崩溃后是否拉起,别漏掉任一
配置加载后 service 不识别:systemd 和原生 supervisord 启动方式别混用
CentOS/RHEL 7+ 和 Ubuntu 16.04+ 自带 supervisor.service 单元,但它的默认配置可能指向 /etc/supervisord.conf,而你实际改的是 /etc/supervisor/conf.d/ 下的 ini 文件——这时 systemctl restart supervisor 看似成功,其实没加载你的 program 配置。
- 要么统一走 systemd:确认
/lib/systemd/system/supervisor.service中ExecStart是否带-c /etc/supervisord.conf,且该文件里[include]正确指向你的配置目录(如files = /etc/supervisor/conf.d/*.conf) - 要么弃用 systemd,直接用原生命令:
sudo supervisord -c /etc/supervisord.conf启动,再用supervisorctl -c /etc/supervisord.conf管理 - 改完配置必须执行
supervisorctl reread && supervisorctl update,不是 reload —— reload 只重载主配置,不扫描新增的 program 文件
真正麻烦的从来不是装不上,而是配置项之间隐性耦合:比如改了 user 却忘了同步 directory 权限,或者开了 autorestart 却卡在 startsecs 判定逻辑里。动手前先 supervisord -c /etc/supervisord.conf -n -d 前台试跑,看 stderr 输出,比盲调快得多。










