Grok运行中途崩掉解决:设置守护进程自动重启的配置方案
Grok服务动不动就崩?别慌,用supervisord来守护它,配置好autorestart、startsecs=15这些参数,就能自动拉起,还能防误判重启。国产系统的话,首选systemd,设置OOMScoreAdjust=-900,防止被OOM Kill。要是连root权限都没有,那就用Shell循环脚本兜底——总有一款适合你。

Grok模型服务跑到一半突然退出,推理请求直接挂掉,WebUI白屏,用户等半天没反应——这种场景谁遇到谁知道。这不是偶发,是大模型服务在内存压力、CUDA上下文异常或Python GC抖动下常见的稳定性缺口。
用supervisord守护Grok进程(推荐方案)
这一步操作起来很简单,把Grok启动命令交给supervisord就行,不需要改业务代码。
第一步:确认supervisord已安装并运行
执行sudo supervisorctl status,如果提示FATAL或Connection refused,那就先跑一下sudo supervisord -c /etc/supervisord.conf,让守护主进程起来。
第二步:在/etc/supervisord.d/目录下新建配置文件
执行sudo nano /etc/supervisord.d/grok-webui.conf,填入下面这些内容:
[program:grok-webui]
command=/root/grok-webui/start.sh
directory=/root/grok-webui
autostart=true
autorestart=true
startsecs=15
stopwaitsecs=30
stderr_logfile=/var/log/grok-webui.err
stdout_logfile=/var/log/grok-webui.out
user=root
environment=PATH="/usr/local/bin:/usr/bin",HOME="/root"
【startsecs=15是关键】
第三步:重载配置并启动
执行sudo supervisorctl reread && sudo supervisorctl update && sudo supervisorctl start grok-webui,服务会立刻拉起,进入监控状态。
第四步:验证崩溃自动恢复能力
手动杀死进程试试:sudo supervisorctl stop grok-webui → 等5秒 → 跑ps aux | grep start.sh,如果看到新进程PID变了,就说明自动拉起生效了。再用curl http://localhost:7860测一下接口,看看有没有恢复响应。
systemd原生服务方式(麒麟OS/国产系统首选)
如果你用的是银河麒麟V10 SP1或统信UOS Server 20,systemd比supervisord更深度集成,还支持OOMScoreAdjust,能有效防止被OOM Killer优先干掉。
方法一:创建服务单元文件
执行sudo nano /etc/systemd/system/grok-webui.service,写入:
[Unit]
Description=Grok WebUI Service
After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
User=root
WorkingDirectory=/root/grok-webui
ExecStart=/root/grok-webui/start.sh
Restart=always
RestartSec=8
MemoryLimit=12G
OOMScoreAdjust=-900
KillMode=control-group
[Install]
WantedBy=multi-user.target
【OOMScoreAdjust=-900是关键】
方法二:启用并启动服务
依次执行:sudo systemctl daemon-reload → sudo systemctl enable --now grok-webui.service → sudo systemctl status grok-webui.service,确认状态显示active (running),就搞定了。
轻量级Shell循环守护(无root权限场景)
如果只有普通用户权限,装不了supervisord也没法改systemd,那就用纯Shell脚本做一个最小闭环守护。
在/home/yourname/grok-guard.sh中写入:
#!/bin/bash
cd /home/yourname/grok-webui
while true; do
if ! pgrep -f "start.sh" > /dev/null; then
echo "$(date): Grok process missing, restarting..." >> /home/yourname/grok-guard.log
nohup ./start.sh > /dev/null 2>&1 &
fi
sleep 10
done
给执行权限:chmod +x /home/yourname/grok-guard.sh
后台启动守护:nohup /home/yourname/grok-guard.sh > /dev/null 2>&1 &
注意:这个脚本每10秒轮询一次进程是否存在,不依赖信号机制,所以没法感知“假死”(进程还在但无响应的情况),仅适合做基础保活。如果追求更精细的监控,建议还是用前两种方案。