OpenClaw Gateway 多节点故障排查与 systemd 服务恢复实战指南
OpenClaw Gateway 多节点故障排查与 systemd 服务恢复实战指南 前言 今天晚上8点,我们的监控系统同时检测到三台运行 OpenClaw Gateway 的服务器出现问题:VM151 和 VM152 的 Gateway 服务停止运行,VPS4 存在端口冲突导致新进程无法启动。本文将详细记录这次故障的完整排查和修复过程,并提供系统化的诊断思路和解决方案。
问题现象 故障节点概览
节点
角色
问题现象
严重程度
VM151
主力Gateway节点
systemd服务消失,进程停止
🔴 严重
VM152
备用Gateway节点
systemd服务消失,进程停止
🔴 严重
VPS4
远程Gateway节点
端口18789被占用,新进程无法启动
🟡 中等
具体报错信息 VM151 / VM152 报错:
1 2 3 Failed to start openclaw-gateway.service: Unit openclaw-gateway.service not found. Runtime: stopped (state inactive, sub dead, last exit 0 , reason 0 ) RPC probe: failed
VPS4 报错:
1 2 3 Port 18789 is already in use.- pid 2756798 node: openclaw-gateway (***.** *.* **.** :18789)- Gateway already running locally. Stop it (openclaw gateway stop) or use a different port.
排查过程 第一步:并行检测所有节点状态 面对多节点故障,第一步应该是并行检测所有节点的状态,避免串行排查浪费时间。使用批量SSH命令同时获取多台机器的信息:
1 2 3 4 5 6 7 8 9 10 11 #!/bin/bash NODES=("root@***.***.***.***" "root@***.***.***.***" "root@***.***.***.**" )for node in "${NODES[@]} " ; do echo "=== Checking $node ===" ssh -o ConnectTimeout=10 "$node " "openclaw status --json 2>/dev/null | head -50" &done wait
第二步:检查 systemd 服务状态 在每台节点上分别检查 systemd 服务的状态:
1 2 3 4 5 6 7 8 9 systemctl list-unit-files | grep openclaw systemctl status openclaw-gateway.service --no-pager systemctl --user list-unit-files | grep openclaw systemctl --user status openclaw-gateway.service --no-pager
VM151/VM152 的问题根源: systemctl 服务文件不存在,但进程可能还在运行(被某个方式启动了,但没有用 systemd 管理)。
第三步:检查端口和进程状态 1 2 3 4 5 6 7 8 9 10 ss -tlnp | grep 18789 netstat -tlnp | grep 18789 ps aux | grep openclaw ps -eo pid,lstart,cmd | grep openclaw
VPS4 的问题根源: 存在一个从昨天就启动的旧版 openclaw-gateway 进程(pid 2756798,Mar23 启动),占用了端口 18789,导致新版服务无法启动。
第四步:分析服务配置文件 1 2 3 4 5 cat ~/.config/systemd/user/openclaw-gateway.servicecat ~/.openclaw/openclaw.json | jq '.'
解决方案 方案一:重建 systemd 服务(适用于 VM151 / VM152) 当 systemctl 服务单元文件丢失或损坏时,需要重新安装服务:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 openclaw gateway install systemctl --user enable openclaw-gateway.service systemctl --user start openclaw-gateway.service systemctl --user status openclaw-gateway.service --no-pager journalctl --user -u openclaw-gateway.service -f
关键点: enable 和 start 要分开执行,并且 enable 必须在 start 之前或者服务已经安装好之后执行。
方案二:解决端口冲突(适用于 VPS4) 端口冲突通常是因为旧进程没有正确关闭,需要先终止旧进程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ss -tlnp | grep 18789 ps -p <PID> -o lstart=kill <PID>kill -9 <PID>sleep 3 systemctl --user start openclaw-gateway.service ss -tlnp | grep 18789
注意: 在终止进程之前,务必确认该进程不是生产环境正在使用的正常进程。
方案三:服务状态全面检查脚本 为了避免类似问题再次发生,建议定期执行以下检查脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 #!/bin/bash NODES=( "***.***.***.***" "***.***.***.***" "***.***.***.**" )echo "========== OpenClaw Gateway 服务全面检查 ==========" echo "时间:$(date '+%Y-%m-%d %H:%M:%S') " echo "" for node in "${NODES[@]} " ; do echo "=== $node ===" ssh -o ConnectTimeout=10 "$node " " echo '[1] systemd 服务状态:' systemctl --user list-unit-files | grep openclaw || echo ' 无 openclaw 服务单元文件' echo '' echo '[2] 服务运行状态:' systemctl --user status openclaw-gateway.service --no-pager 2>&1 | head -5 || echo ' 服务未运行' echo '' echo '[3] 进程状态:' ps aux | grep -E '[o]penclaw' | head -3 || echo ' 无运行中的进程' echo '' echo '[4] 端口占用:' ss -tlnp 2>/dev/null | grep 18789 || echo ' 端口 18789 未被占用' " || echo " SSH 连接失败" echo "" done echo "========== 检查完成 =========="
使用方法:
1 2 chmod +x openclaw-gateway-service-check.sh ./openclaw-gateway-service-check.sh
根因分析 为什么 systemd 服务文件会消失? 根据本次故障的排查结果,systemd 服务单元文件丢失的可能原因包括:
系统更新覆盖配置
某些 Linux 发行版在更新 systemd 或相关包时,可能会清理或重置用户级服务配置
特别是 $HOME/.config/systemd/user/ 目录下的用户服务文件,可能被误认为”不属于任何包”而被清理
升级过程中配置未迁移
如果 OpenClaw 是通过包管理器安装的,升级时可能会覆盖用户修改的配置文件
建议在升级前备份配置:cp -r ~/.config/systemd ~/.config/systemd.bak.$(date +%Y%m%d)
HOME 目录变更
如果服务的运行环境变量发生变化,可能导致 systemd 无法找到服务文件
预防措施 为避免类似问题再次发生,建议实施以下预防措施:
措施
说明
优先级
服务文件备份
每次修改服务配置后,备份到独立位置
🔴 高
定期检查服务状态
使用 cron 定期执行服务状态检查
🔴 高
使用 enable --now
同时启用并立即启动,避免漏掉 enable
🟡 中
配置版本控制
将服务配置文件纳入 Git 管理
🟡 中
告警阈值优化
当服务状态变化时立即告警
🔴 高
推荐的定时检查 Cron 配置 1 2 3 4 5 0 * * * * /opt/scripts/openclaw-gateway-service-check.sh >> /var/log/openclaw-check.log 2>&1 0 * * * * /opt/scripts/openclaw-gateway-auto-heal.sh && /usr/local/bin/send-alert.sh "OpenClaw Gateway 已自动恢复"
一键恢复脚本 以下脚本可用于快速恢复单节点 OpenClaw Gateway 服务:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 #!/bin/bash set -eecho "========== OpenClaw Gateway 快速恢复 ==========" if ! command -v openclaw &> /dev/null; then echo "❌ openclaw 命令未找到,请先安装" exit 1fi if systemctl --user list-unit-files | grep -q openclaw-gateway.service; then echo "✓ 服务单元文件已存在" else echo "📦 安装 systemd 服务..." openclaw gateway installfi echo "⚙️ 启用开机自启..." systemctl --user enable openclaw-gateway.service PORT=$(ss -tlnp 2>/dev/null | grep 18789 || echo "" )if [ -n "$PORT " ]; then echo "⚠️ 端口 18789 被占用,正在检查..." OLD_PID=$(echo "$PORT " | grep -oP 'pid=\K[0-9]+' ) if [ -n "$OLD_PID " ]; then echo "🛑 终止旧进程 $OLD_PID ..." kill $OLD_PID || kill -9 $OLD_PID sleep 2 fi fi echo "🚀 启动服务..." systemctl --user start openclaw-gateway.servicesleep 3if systemctl --user is-active --quiet openclaw-gateway.service; then echo "✅ 服务启动成功!" systemctl --user status openclaw-gateway.service --no-pager | head -5else echo "❌ 服务启动失败,查看日志:" journalctl --user -u openclaw-gateway.service -n 20 --no-pager exit 1fi echo "" echo "========== 恢复完成 =========="
使用方法:
1 2 chmod +x openclaw-gateway-quick-recover.shsudo ./openclaw-gateway-quick-recover.sh
常见问题解答 Q1:如何判断是 systemd 服务丢失还是进程崩溃?
A:两者表现不同:
systemd 服务丢失:进程完全不存在,但手动可以启动进程
进程崩溃:进程不存在,但 systemd 显示服务失败
检查方法:
1 2 3 4 5 ls ~/.config/systemd/user/openclaw-gateway.service ps aux | grep openclaw
Q2:服务启动后立即停止怎么办?
A:查看详细日志:
1 2 3 4 5 journalctl --user -u openclaw-gateway.service -ftail -f /tmp/openclaw/openclaw-$(date +%Y-%m-%d).log
常见原因:配置文件错误、端口被占用、依赖服务未启动。
Q3:如何彻底排查端口占用问题?
A:按以下步骤排查:
1 2 3 4 5 6 7 8 9 10 11 ss -tlnp | grep 18789 ps -p <PID> -fcat /proc/<PID>/cmdline | tr '\0' ' ' kill <PID>
Q4:如何防止升级后服务配置丢失?
A:使用以下策略:
1 2 3 4 5 6 7 8 9 10 11 12 cp -r ~/.config/systemd ~/.config/systemd.bak.$(date +%Y%m%d)cp ~/.openclaw/openclaw.json ~/.openclaw/openclaw.json.bak.$(date +%Y%m%d) npm update -g openclawcp ~/.config/systemd.bak.*/user/openclaw-gateway.service ~/.config/systemd/user/ systemctl --user daemon-reload
Q5:多节点如何统一管理服务配置?
A:可以使用配置管理工具如 Ansible 或 Salt,或者使用 GitOps 方式:
1 2 3 4 5 6 git clone git@your-git-server:openclaw-config.git ~/.openclaw-configln -sf ~/.openclaw-config/openclaw.json ~/.openclaw/openclaw.jsonln -sf ~/.openclaw-config/openclaw-gateway.service ~/.config/systemd/user/
总结 本次故障的核心问题是:systemd 服务单元文件在系统更新过程中丢失 ,导致三台服务器的服务无法通过 systemd 管理,尽管部分节点上可能还有旧进程在运行。
关键经验:
systemd 服务需要定期检查 ——不能只检查进程状态
enable 和 start 要同时考虑 ——enabled 确保开机自启,start 确保立即运行
端口冲突要先清理旧进程 ——新服务无法绑定已被占用的端口
日志是排查的关键 ——通过 journalctl 可以快速定位启动失败原因
通过本次故障的排查和修复,我们完善了健康检查脚本,增加了 systemd 服务状态的检查项,并编写了一键恢复脚本,确保下次遇到类似问题能够快速响应。
作者:小六,一个在上海努力搬砖的程序员