首页/系统/Linux 运维命令速查/场景:托管进程反复失败的处理
进程与作业69 条

场景:托管进程反复失败的处理

supervisor 里的进程 restart 后秒退:先看它自己的日志与退出码,再判断配置(命令路径/用户/环境)问题,别反复无脑 restart。

Linux 运维命令速查系统更新于 2026-10-13

这个场景解决什么

supervisor 托管的进程重启之后立刻退出,日志里反复出现启动失败。这时不该继续无脑 restart,而应按顺序看三件事:它自己的标准错误输出与退出码、配置里的命令与运行用户、以及按同样条件手工执行一次能否成功。多数问题最终都落在路径、环境变量与工作目录上。

基本信息

场景supervisor 托管的进程起不来或启动后秒退
组合方式status 查看 + tail 看输出 + 手工复现
关键配置项command、user、directory、environment
日志位置supervisord 自身日志与程序的标准错误输出

典型使用场景

  • 服务发布后进程反复退出,需要定位根因
  • 更换运行用户之后突然起不来
  • 相对路径在新环境里失效导致启动失败
  • 环境变量缺失导致找不到命令或模块
  • 启动脚本改为前台运行后行为发生变化
  • 排查 STARTING 状态长时间卡住不动

看现场与手工复现

看现场与手工复现
supervisorctl status                 # 看状态与最近一次退出信息
supervisorctl tail app-worker stderr # 查看错误输出
tail -n 50 /var/log/supervisor/app-worker-stderr*.log
grep -E 'command|user|directory|environment' /etc/supervisord.d/app-worker.ini
sudo -u www-data bash -lc 'cd /opt/app && ./run.sh'   # 按配置条件手工跑一次
systemctl status supervisord --no-pager | head        # 确认守护进程状态
supervisorctl reread && supervisorctl update          # 让改动真正生效

排查顺序

步骤动作目的
一看 status 与最近退出信息区分退出与启动失败
二看标准错误与日志文件拿到真实报错
三核对 command 与 user确认参数与身份符合预期
四按配置条件手工执行一次区分配置问题与程序问题
五reread 与 update让改动真正生效
supervisor 不加载登录 shell 的环境:找不到命令或模块的报错,多半是 PATH 与虚拟环境变量缺失,配置里用绝对路径或 environment= 显式声明即可解决。
改完 ini 必须执行 reread 再 update,否则运行的还是旧配置;反复 restart 只是让同一个问题再出现一次,日志越刷越多。
STARTING 状态长时间不动,通常是 startsecs 与进程实际启动耗时不匹配,或者程序实际在前台运行却被当成后台程序处理。
如果程序本身是前台运行的脚本,配置里的命令不要用 & 或 nohup 让它自行后台化:supervisor 需要直接持有主进程,否则会立刻判定进程已退出。

易错点

  • 无脑 restart:每次都用同一份错误配置启动,日志刷满而根因未动
  • 改了 ini 不执行 update:进程仍在跑旧命令,误判配置无效
  • 忽略运行用户差异:手工用 root 能跑,supervisor 以服务账号运行就失败
  • startsecs 与实际启动时间不匹配:状态卡在 STARTING 或反复判定失败

数据来源与参考

  • supervisor 官方文档(supervisord.org)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌