supervisor能解决进程断ssh即挂、崩溃不自启问题,但需确保路径、权限、用户三者对齐:systemctl启动服务、修正socket路径为/var/run/supervisor.sock、配置中command用绝对路径、user存在且有权限、startsecs设为5-10、environment显式声明、配置文件按发行版放对应目录并以.conf或.ini结尾、reread后update生效。

Supervisor 能直接解决“进程后台运行但一断 SSH 就挂”“脚本崩溃后不自启”这类问题,但安装和配置稍有偏差就会卡在 supervisorctl 连不上、日志空白、或进程启动即退出——核心在于路径、权限、用户三处必须对齐。
用 apt/yum 安装后为什么 supervisorctl status 报 “Failed to connect”
这是最常见卡点:服务没真正跑起来,或 socket 文件路径/权限不匹配配置。
- 先确认服务状态:
sudo systemctl status supervisord,若显示inactive (dead),说明没启动 - systemd 系统(Ubuntu 16.04+/CentOS 7+)必须手动启动:
sudo systemctl start supervisord,再enable开机自启 - 检查主配置中
[unix_http_server]的file路径,默认是/tmp/supervisor.sock,但/tmp下的文件可能被系统清理;务必改成/var/run/supervisor.sock并确保目录存在且可写:sudo mkdir -p /var/run && sudo chmod 755 /var/run - 改完配置要重启服务:
sudo systemctl restart supervisord,不能只 reload
[program:xxx] 配置里哪些参数最容易导致进程启动即退出
进程“闪退”不是程序本身问题,而是 Supervisor 启动时校验失败或环境缺失。
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
-
command必须是绝对路径,比如python3 /home/user/app.py,不能写python3 app.py(directory不影响 command 解析) -
user指定的用户必须真实存在,且对该command路径、日志路径、工作目录有读/执行/写权限;用root虽快但不安全,建议建专用用户如bot -
startsecs默认是 1 秒,如果程序冷启动慢(比如 Django 或某些 Python Web 框架),设太小会导致 Supervisor 认为“启动失败”而反复拉起;建议设为5或10 - 缺
environment可能导致依赖环境变量的脚本失败,例如PATH、PYTHONPATH或项目专属变量,可显式加一行:environment=PATH="/usr/local/bin:/usr/bin:/bin"
配置文件放哪、怎么让 Supervisor 读到它
路径错或格式错,supervisorctl reread 就不会识别新配置。
- Debian/Ubuntu 默认读
/etc/supervisor/conf.d/*.conf;CentOS/RHEL 默认读/etc/supervisord.d/*.ini—— 注意后缀和目录名,不同发行版不互通 - 文件名必须以
.conf或.ini结尾,且不能有空格或特殊字符;内容开头不能有 BOM 或 UTF-8 签名 - 写完配置后,分两步生效:
sudo supervisorctl reread(扫描新文件)→sudo supervisorctl update(载入并尝试启动) - 如果
update后状态仍是STARTING或FATAL,立刻查日志:sudo tail -20 /var/log/supervisor/supervisord.log,里面会明确报出是权限拒绝、命令找不到,还是用户不存在
为什么开了 web 界面却连不上,或登录后看不到进程
web 界面只是个前端代理,底层仍依赖 supervisord 正常运行和配置加载成功。
- 启用 web 前,先确保
[inet_http_server]段落已取消注释,并修改port(别用9001,避免冲突),username和password必须设置 - 防火墙要放行对应端口:
sudo ufw allow 9111(假设你设的是 9111) - web 界面不显示进程,大概率是
supervisorctl update没成功,或配置文件语法错误(比如漏了=、多写了空格);可用sudo supervisorctl status在终端确认是否已识别 - 浏览器访问时,URL 是
http://:9111,不是localhost;如果用宝塔等面板,注意它可能屏蔽了非 80/443 端口的外网访问
真正麻烦的从来不是装不上,而是 supervisord 进程起来了,supervisorctl 也能连上,但你写的那个 [program] 就是起不来——这时候得盯死 supervisord.log 和你配的 stdout_logfile,90% 的问题藏在那两行报错里。










