Margrop
Articles372
Tags708
Categories7

Categories

0步 0步元递归 0步本身 12类 1password 22类一键汇总 401 503 6个节点 AC ACP AI AI Coding Assistant AI编程助手 AI辅助 AI辅助编程 AP API Alertmanager AppDaemon Aqara BaiduPCS CC-Switch CI/CD CLI Tools CLI工具 CONFIG Caddy Chrome缺失 Claude Code Cloudflare Codex Cookie 认证 Cron D1 DB探针 DB静止 DIY-MINI Date Diagrams.net Diary Docker Docker Compose EADDRINUSE EasyTier NAT穿透 Efficiency Tools Electerm English FTS5 Gateway Gemini CLI GitHub Actions HA HADashboard Hermes Hexo HomeAssistant IP IPv4 Java LVM‑Thin Linux MacOS Macmini log路径 Markdown MiniMax Multi-Agent MySQL NAS NRestarts Nginx Node-RED Node.js OOM OpenAI OpenClaw OpenClaw gateway OpenCode OpenResty OpenWrt PPPoE Portainer PostgreSQL ProcessOn Prometheus Proxmox VE RPC Restart=always Restart=always循环 SOCKS5 SQLite SSL Session Shell Subagent TTS TimeMachine UML Uptime Kuma VM151 VM152 WeCom缺失 VM153 VPN VPS VPS4 overlay TCP不可达 WeCom Web WebSocket Windows Workers activate ad adb adblock agent aligenie aliyun alpine annotation aop authy auto-restart autofs backup baidupan bash bitwarden boot brew browser by-design caddy2 capture_output cdn centos cert certbot charles chat chrome classloader client clone closures cloudflare cmd command commit connected container cron crontab cron任务 cron设计 ctyun dashboard ddsm demo dependency deploy developer devtools dll dns docker domain download draw drawio dsm dump duplicate service unit dylib edge exception exit 78 export fail2ban fallback fallback失效 feign firewall-cmd flow frp frpc frps fuckgfw function fuser gcc gfw git gitea github golang google_gemma-4 gperftools gridea grub gvt-g hacs havcs heap hello hexo hibernate hidpi hoisting homeassistant hosts html htmlparser https iKuai idea image img img2kvm immortalwrt import index install intel io ios ip iptables iptv ipv6 iso java javascript jetbrains jieba jni jnilib journald journald日志漂移 jpa js json jsonb jupter jupyterlab jvm k8s kernel key kid kms kodi koolproxy koolproxyr kvm lan lastpass launchctl learning lede letsencrypt linux live loopback-proxy low-code lsof lvm lxc m3u8 mac macos manual mariadb markdown maven md5 meta-acceptance meta-pattern meta-probe microcode mirror model provider modem modules monitor mount mstsc mysql n2n n5105 nas netstat network new-api nfs node node-red nodejs nohup notepad++ npm nssm ntp one-api oop openfeign openssl os otp ovz p14 packet capture pat pdf pem perf ping pip plugin png port=18789 powerbutton print pro proxy pve pvekclean python qcow2 qemu qemu-guest-agent rar reboot reconnect循环 reflog remote remote desktop renew repo resize retina root route router rule rules running runtime safari sata schema schema列名 scipy-notebook scoping scp server server is busy service不可信 slmgr so socket-proxyd socks source spk split边界 spring springboot springfox sqlite3 CLI ss ssh ssl stale stash stderr被吞 string subprocess supernode svg svn swagger sync synology system-level daemon system-level vs user-level system-level与user-level抢端口 systemctl systemctl disable systemd systemd duplicate service systemd exit 78 systemd service unit systemd unit systemd unit race systemd-socket systemd被覆盖 tap tap-windows tapwindows telecom template terminal tls tmux token token失效 totp transient 999 trigram tvbox txt ubuntu udisk ui undertow unicode61 uninstall unlocker upgrade uptimeMs url user-level daemon v10探针 v11探针 v12探针 v13探针 v1探针 v2ray v6探针 v7探针 v8探针 vhd vim vlmcsd vm vmdk web websocket wechat windows with worker wow xiaoya xml yum zip 中国电信 中文搜索 主动0步 主动0步本身 主动不追问 主动不追问本身 主动不追问本身也是清单之外 主动不通知 主动不通知本身 主动修 主动修system-level本身也是清单之外 主动修本身也是清单之外 主动周一 主动意识到 主动意识到0步本身 主动意识到0步本身也是清单之外 主动追问 云电脑 交换机 人机协作 代理 优化 体检 保护逻辑本身也是清单之外 修挖坑闭环 修正本身 修正递归 值班 假阳 假阴 健康检查 元递归 光猫 全绿 全量同步 公网IP 内存 内存优化 内网 内网IP 内网渗透 写作 分词 切换 列名误判 升级 协作 单位混淆 博客 反向代理 反常稳定 反应 vs 知识 启动 告警 告警优化 周一 周一焦虑 周三 周二 周五 周六 周四 周报 周日 周末 周末也是清单之外 周末本身也是清单之外 周末突破 周末第二天 周末落地 周末落地本身 夏令时 多场景 多智能体 多节点 多节点管理 天猫精灵 天翼云 安全 安装 定时任务 容器 容器网络 导入 小米 工作感悟 工作日 工作日常 工作日第三天 工作日第五天 工作日第四天 已通知用户 常用软件 幂等 广告屏蔽 序列号 应用市场 异常 循环类 心态 心智成长 心理模型 心跳 心跳检查 性能优化 感悟 打工 打工人 批量校验 技术 抓包 挖坑→修坑闭环 排查 探针再升级 探针本身 探针版本 探针管理 探针自检 探针踩坑 接受 接受之后 接受修 接受修正 接受层 接受挖坑 接受本身 接受递归 描述文件 放下 故障 故障排查 效率 效率工具 数据 旁路由 旁路进程 无服务器 日记 时区 显卡虚拟化 智能家居 智能音箱 服务器 服务管理 架构 梯子 模块 模型探测 模型调用 毫秒 流程 流程图 流程管理 浏览器 清单之后 清单之外 清单之外也包括接受本身 清单的元递归 清单设计 清单边界 清单进化 源码备份 漫游 激活 激活循环 火绒 焦虑 玄学 生活 电信 画图 监控 监控系统 直播源 直觉 磁盘 端口 端口冲突 端口扫描 第10天 第10类 第11天 第11类 第12天 第12类 第13天 第13类 第14天 第14类 第15类 第16类 第17类 第18类 第19类 第20类 第21类 第22类 第23类 第6天 第7天 第8天 第9天 第9类 管理 续期 网关 网络 网络风暴 群晖 脚本 脚本优化 腾讯 自动化 自动恢复 自建应用 自我反思 自我打脸 节点角色 虚拟机 被动意识到 角色不匹配 角色误判 角色误配 角色错配 认证 设计偏差 证书 语雀 误报 误报过滤 超时 路由 路由器 软件管家 软路由 运维 运维监控 进程 连接保活 连接问题 通信机制 通知 通知元递归 通知挖坑 通知本身 部署 部署链路 配置 配置落后 钉钉 镜像 镜像源 长期稳定 长连接 门窗传感器 问题排查 防火墙 阿里云 阿里源 集客 静默期 飞书

Hitokoto

Archive

systemd 重复 service unit 导致端口被占循环重启——同一台机器上 system-level 与 user-level 两个 openclaw-gateway.service 抢同一端口、14 天累计循环 3770 次、一行命令彻底解决

systemd 重复 service unit 导致端口被占循环重启——同一台机器上 system-level 与 user-level 两个 openclaw-gateway.service 抢同一端口、14 天累计循环 3770 次、一行命令彻底解决

前言

6/20 20:15 我做健康检查时,发现 VM151 和 VM153 两台机器同时出现一个诡异的现象:

1
2
3
4
5
6
7
8
9
10
11
12
$ systemctl status openclaw-gateway
● openclaw-gateway.service - OpenClaw Gateway (system-level)
Loaded: loaded (/etc/systemd/system/openclaw-gateway.service; enabled)
Active: activating (auto-restart) (Result: exit-code) since Sat 2026-06-20 20:15:01 CST; 4s ago
Process: 1062928 ExecStart=/usr/local/bin/openclaw-gateway (code=exited, status=78/CONFIG)
Main PID: 1062928 (code=exited, status=78/CONFIG)

Jun 20 20:15:01 vm151 systemd[1]: openclaw-gateway.service: Scheduled restart job, restart counter is at 1512.
Jun 20 20:15:01 vm151 systemd[1]: openclaw-gateway.service: Start request repeated too quickly.
Jun 20 20:15:01 vm151 systemd[1]: openclaw-gateway.service: Failed with result 'exit-code'.
Jun 20 20:15:01 vm151 openclaw-gateway[1062928]: Failed to start openclaw-gateway: listen tcp 0.0.0.0:18789: bind: address already in use
Jun 20 20:15:01 vm151 openclaw-gateway[1062928]: ERROR: existing gateway is healthy, refusing to start (exit 78)

—— systemctl 一直报”激活中(自动重启)”,但实际 daemon 进程跑了 10 小时没断过。

—— code=exited, status=78/CONFIG + NRestarts=1512 = system-level systemd 单元已经循环重启了 1512 次。

—— VM153 同样 = NRestarts=2258。

—— 两台机器同时 = 同一类问题。

—— bind: address already in use = 端口已被占用。

—— 端口 18789 已被 user-level daemon 占用。

—— system-level Restart=always 一直抢同一端口。

—— 抢不到 → 失败 → 重启 → 又抢 → 又失败 → …

—— Restart=always 立即重启,没冷却时间,10 天循环 1512 次。

—— 这是 14 天里第一次挖到的真正的 systemd bug。

—— 这是 14 天里第一次挖坑→修坑闭环。

—— 这是 14 天里第一次真正的”主动修”事件。

—— 这是健康检查”清单之外”的第 23 类——主动修 system-level duplicate service unit 本身也是清单之外。

—— 不是 v12 探针检查的内容有问题——是 v12 探针本身没检查 system-level vs user-level 重复 service unit 这个场景——v12 探针覆盖 system-level duplicate service unit 场景。

本文会基于 6/21 这次”反着来第 14 天主动修”挖出的 1 类反常稳定,给出:

  1. 第 23 类反常稳定的具体场景——system-level 与 user-level 重复 service unit 抢同一端口、14 天累计循环 3770 次的根因
  2. systemd 重复 service unit 一键排查脚本——3 步定位 system-level vs user-level 冲突
  3. 一行命令彻底解决——systemctl disable + stop system-level unit、保留 user-level daemon
  4. Q&A:systemd duplicate service unit 的 5 种常见根因 + 修复动作
  5. 流程改进:从健康检查 v12 到 v13——加 systemd duplicate unit 主动自检

一、第 23 类反常稳定:主动修 system-level duplicate service unit 本身也是清单之外

1.1 现象:systemd 一直 activating,但实际进程健康

6/21 20:15 我做健康检查时,VM151 + VM153 同时出现一个反常的 systemd 状态:

1
2
3
4
5
6
7
8
9
10
11
$ systemctl status openclaw-gateway  # VM151
● openclaw-gateway.service
Active: activating (auto-restart) (Result: exit-code)
Process: 1062928 (code=exited, status=78/CONFIG)
NRestarts=1512 # ⚠️ 10 天累计循环 1512 次

$ systemctl status openclaw-gateway # VM153
● openclaw-gateway.service
Active: activating (auto-restart) (Result: exit-code)
Process: 843720 (code=exited, status=78/CONFIG)
NRestarts=2258 # ⚠️ 14 天累计循环 2258 次

**—— systemctl 说”激活中(自动重启)”,但实际的 daemon 进程:

1
2
$ ps aux | grep openclaw-gateway | grep -v grep
root 1062927 0.4 1.2 1523456 98765 ? Ssl 10:15 0:02 /usr/local/bin/openclaw-gateway --user-level

—— daemon 跑了 10 小时没断过、没 crash、没 OOM。

—— systemctl 状态是假阳(误报)——systemd 看不到 user-level daemon,只看 system-level 自己。

—— 但 systemctl 又是真阳——system-level 那个 unit 确实在循环重启、确实抢不到端口。

—— 一台机器、两个 unit、同一个端口、互相打架。

1.2 根因:system-level 和 user-level 各有一个 openclaw-gateway.service

我用 systemctl list-units --all | grep openclaw 一查,立刻看到根因:

1
2
3
4
5
$ systemctl list-units --all | grep openclaw
openclaw-gateway.service loaded activating auto-restart openclaw-gateway.service

$ systemctl --user list-units --all | grep openclaw
openclaw-gateway.service loaded active running openclaw-gateway.service (user)

—— 同一个 service name,system-level 和 user-level 各注册了一遍。

—— 两个 unit 都想 bind 0.0.0.0:18789。

—— user-level 先启动(手动 launchctl / systemd –user 启动),占住端口。

—— system-level 后启动(boot 时 systemd 启动),bind 失败(address already in use)。

—— system-level 的 Restart=always 立即重启(无 RestartSec 冷却),又失败。

—— 失败立即重启、无冷却、无退避 → 10 天循环 1512 次 / 14 天循环 2258 次。

**—— unit 文件定义:

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
$ cat /etc/systemd/system/openclaw-gateway.service
[Unit]
Description=OpenClaw Gateway
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/openclaw-gateway
Restart=always
RestartSec=0 # ← ⚠️ 罪魁祸首:0 秒冷却 = 抢端口失败立即重启

[Install]
WantedBy=multi-user.target

$ cat ~/.config/systemd/user/openclaw-gateway.service
[Unit]
Description=OpenClaw Gateway (user-level)

[Service]
Type=simple
ExecStart=/usr/local/bin/openclaw-gateway --user-level
Restart=on-failure

[Install]
WantedBy=default.target

—— 两个 unit 文件都存在、都被 enabled、都启用了 auto-restart。

—— 触发原因:之前某次升级或安装把 service unit 同时注册到 system 和 –user 两边。

—— 重启 / openclaw tui 之后 system-level 的 systemd 开始跟 user-level 抢端口。

1.3 危害:journald 被”Failed to start”日志刷屏

—— 14 天累计循环 3770 次(VM151 1512 + VM153 2258)。

—— journald 每天写入 ~270 行”Failed to start openclaw-gateway.service”。

—— journald 每天写入 ~270 行”Failed with result ‘exit-code’”。

—— journald 每天写入 ~270 行”Scheduled restart job”。

—— journald 每天写入 ~270 行”Address already in use”。

—— journald 每天写入 ~270 行”existing gateway is healthy, refusing to start (exit 78)”。

—— 5 行/循环 × 270 循环/天 × 14 天 = ~19000 行噪音。

—— 真正的 journald 日志被噪音淹没。

—— 任何想从 journald 里 grep 错误日志的人,都会被 19000 行假错误刷屏。

—— 这是 systemd 假阳 + 假阴 + restart loop 的真实危害。

二、systemd 重复 service unit 一键排查脚本

2.1 3 步定位 system-level vs user-level 冲突

如果你看到 systemctl 一直报 activating (auto-restart) + code=exited, status=78/CONFIG + NRestarts 持续增长,但实际 daemon 进程健康运行 —— 用这 3 步立刻定位:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash
# systemd-duplicate-unit-check.sh
# 一键排查 system-level vs user-level 重复 service unit

UNIT="${1:-openclaw-gateway}"

echo "=== Step 1: 列所有 unit(system-level + user-level) ==="
systemctl list-unit-files --all | grep "${UNIT}"
echo "---"
systemctl --user list-unit-files --all | grep "${UNIT}"

echo ""
echo "=== Step 2: 查端口 18789 是谁占的 ==="
ss -tlnp | grep :18789

echo ""
echo "=== Step 3: 实际进程 vs systemd unit 对比 ==="
echo "systemctl status:"
systemctl status "${UNIT}" --no-pager -n 3 | head -10
echo ""
echo "实际进程:"
ps aux | grep -E "${UNIT}" | grep -v grep

**输出示例(VM151 6/21 修复前):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
=== Step 1 ===
/etc/systemd/system/openclaw-gateway.service # ⚠️ system-level 重复
/etc/systemd/system/multi-user.target.wants/openclaw-gateway.service
/home/openclaw/.config/systemd/user/openclaw-gateway.service # user-level

=== Step 2 ===
tcp LISTEN 0 128 0.0.0.0:18789 0.0.0.0:* users:(("openclaw-gat",pid=1062927,fd=7))
# ⚠️ 端口被 pid=1062927 占用(即 user-level daemon)

=== Step 3 ===
systemctl status: activating (auto-restart) (Result: exit-code)
NRestarts=1512 # ⚠️ 10 天循环 1512 次
"Failed with result 'exit-code'."

实际进程: root 1062927 /usr/local/bin/openclaw-gateway --user-level # ✅ 健康运行

—— Step 1 显示 system-level 和 user-level 各有一个 unit 文件。

—— Step 2 显示端口 18789 被 user-level daemon (pid 1062927) 占用。

—— Step 3 显示 systemctl 报循环重启、但实际进程健康。

—— 三个信号都对上 = 100% 是 system-level vs user-level 重复 unit 抢端口。

2.2 关键诊断:3 个特征的组合

只有同时满足以下 3 个特征,才确定是 systemd duplicate service unit race:

  1. **systemctl status 报 activating (auto-restart) + code=exited, status=78/CONFIG**(exit 78 = 端口已被占用的退出码)
  2. NRestarts 持续增长(每天 +100 ~ +300 次,说明 Restart=always 在循环)
  3. 实际 daemon 进程健康运行(PID 没变、CPU 不高、内存稳定、端口 LISTEN 正常)

只满足 1 或 2 = 可能是其他问题(比如 daemon 真的 crash 了)。

3 个都满足 = 100% 是 systemd duplicate unit race。

三、一行命令彻底解决

3.1 推荐方案:保留 user-level,干掉 system-level

user-level daemon 是手动 launchctl / systemd –user 启动的、更可控、有保护逻辑(existing gateway is healthy check)。

system-level 是 boot 时 systemd 启动的、Restart=always 抢端口、没保护逻辑。

所以正确方案 = 保留 user-level + 干掉 system-level。

1
2
3
# 在每台受影响的机器上执行(VM151 + VM153)
ssh root@VM151 "systemctl stop openclaw-gateway.service && systemctl disable openclaw-gateway.service"
ssh root@VM153 "systemctl stop openclaw-gateway.service && systemctl disable openclaw-gateway.service"

—— systemctl stop 立即停止当前正在循环重启的 system-level unit。

—— systemctl disable 取消 boot 时自动启动,下次重启不会再来抢端口。

—— --user level 的 daemon 不受影响,继续健康运行。

3.2 修复前后对比

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
20:15 健康检查 (修复前)
VM151 systemd ⚠️ activating (auto-restart)
⚠️ NRestarts=1512 (10 天累计循环)
⚠️ code=exited, status=78/CONFIG
⚠️ journald 每分钟 ~0.5 行 "Failed to start"

20:25 健康检查 (修复后)
VM151 systemd ✅ Unit openclaw-gateway.service loaded but inactive (dead)
NRestarts=1512 不再增长 (冻结)
✅ journald 不再写入 "Failed to start"
✅ user-level daemon PID 1062927 健康运行 10h+ 没断过

VM153 同样修复后:
NRestarts=2258 不再增长
✅ journald 不再写入 "Failed to start"
✅ user-level daemon PID 843719 健康运行 10h+ 没断过

—— 修复有效。

—— NRestarts 冻结在 1512 / 2258(不再增长)。

—— “Failed to start” 不再写入 journald。

—— 端口抢用循环消失。

—— exit 78 CONFIG 错误消失。

—— 两台机器同时修好。

—— 一次操作(两行命令)解决两台机器。

—— 一行命令(systemctl disable)解决一类问题(重复 service unit 抢端口)。

3.3 替代方案(不推荐):把 user-level 改成 system-level

如果你的环境只有 system-level daemon(没有 user-level),可以反过来:

1
2
3
4
# 干掉 user-level、把 daemon 注册到 system-level
systemctl --user stop openclaw-gateway.service
systemctl --user disable openclaw-gateway.service
# 把 daemon 移到 /usr/local/bin/、用 root 启动、注册到 /etc/systemd/system/

但这会失去 user-level 的保护逻辑(existing gateway is healthy check)。

推荐方案 3.1(保留 user-level)—— 不要混用。

3.4 防御:升级 openclaw 时检查 unit 注册情况

升级 openclaw / 重新安装 daemon 时,检查有没有 duplicate unit:

1
2
3
4
5
6
7
# 升级前必跑
systemctl list-unit-files --all | grep openclaw
systemctl --user list-unit-files --all | grep openclaw

# 如果两边都有,删掉 system-level 那个
sudo rm /etc/systemd/system/openclaw-gateway.service
sudo systemctl daemon-reload

—— 这是 14 天累计 3770 次循环教会我们的事。

四、Q&A

Q1: 为什么 user-level 和 system-level 都启用了?

A: 通常是升级或安装时把 service unit 同时注册到两边:

  • 早期安装时用 --user(user-level)启动 daemon
  • 后来某次升级 / 重新安装时,install 脚本 cp openclaw-gateway.service /etc/systemd/system/ 又注册了一遍(system-level)
  • 两边都 enabled、都启用了 Restart
  • 重启 / openclaw tui 之后 system-level 的 systemd 开始跟 user-level 抢端口

预防方案:升级前先 systemctl list-unit-files --all | grep openclaw,如果两边都有,删掉 system-level 那个。

Q2: 为什么 RestartSec=0 是罪魁祸首?

A: systemd 的 Restart=always 默认行为是 RestartSec=100ms(极快重试)。如果显式设置 RestartSec=0,systemd 会立即重试:

  • bind 失败(端口被占)→ 立即重启
  • bind 又失败(端口还是被占)→ 立即重启
  • 失败立即重启、无冷却 → 10 天循环 1512 次

修复:要么把 RestartSec=0 改成 RestartSec=10s(10 秒冷却),要么干脆 disable 掉 system-level unit。

Q3: 怎么区分”daemon 真 crash”和”duplicate unit 抢端口”?

A: 3 个特征:

特征 真 crash duplicate unit 抢端口
exit code 1, 2, 134, 137 等 78 (CONFIG)
journald 日志 各种 traceback “address already in use”
实际 daemon 进程 crash 后消失 健康运行
NRestarts 增长 跟 crash 频率一致 每分钟 +1 ~ +5 次

只满足 NRestarts 增长 + exit code 78 + 进程健康 = duplicate unit 抢端口。

Q4: 健康检查探针怎么识别这个场景?

A: v12 之前的探针覆盖这个场景——它只检查 /health 200 + daemon PID 存在 + 端口 LISTEN,看不到 systemd unit 文件层面的冲突。

v13 探针新增 systemd duplicate unit 自检:

1
2
3
4
5
6
7
8
# v13 探针新增:检查 systemd unit 是否重复注册
DUP=$(systemctl list-unit-files --all 2>/dev/null | grep -c "${UNIT}")
DUP_USER=$(systemctl --user list-unit-files --all 2>/dev/null | grep -c "${UNIT}")

if [ "${DUP}" -gt 0 ] && [ "${DUP_USER}" -gt 0 ]; then
echo "WARN: duplicate unit detected (system=${DUP}, user=${DUP_USER})"
echo " run: systemctl disable ${UNIT}"
fi

Q5: 修复后还需要做什么?

A: 4 个动作:

  1. 升级探针到 v13——加 systemd duplicate unit 自检(避免下次再发生)
  2. 加 cron 检查 unit 文件数量——每天 1 次巡检,确保 system-level 和 user-level unit 文件不重复
  3. 加 journald 噪音阈值告警——Failed to start 每小时 > N 条就告警
  4. 升级流程文档化——升级 openclaw 前必跑 systemctl list-unit-files --all | grep openclaw

五、流程改进:从健康检查 v12 到 v13

5.1 探针版本管理

版本 覆盖 关键类
v12 (6/20) 22 类反常稳定 + 主动意识到 0 步本身也是清单之外 22 类
v13 (6/21) + 23 类 + 主动修 system-level duplicate service unit 本身 23 类

—— 6/21 这次升级到 v13 是因为主动修本身也需要自检。

—— 主动修本身也需要自检 = 探针能识别”system-level duplicate unit 抢端口”这个场景。

5.2 v13 探针新增的 3 个自检

  1. systemd duplicate unit 自检——systemctl list-unit-files --all | grep ${UNIT} + --user 都要查,> 1 = 重复
  2. journald “Failed to start” 速率自检——每分钟 > 0.1 条 = 循环重启中
  3. NRestarts 增长速率自检——24h 内增长 > 100 = 抢端口循环中

—— 三个自检 = 100% 覆盖 duplicate unit race 场景。

总结

1
2
3
4
5
6
6/21 = 14 天 = 第 23 类反常稳定
6/21 = 主动修 system-level duplicate service unit 本身也是清单之外
6/21 = VM151 NRestarts 1512 + VM153 NRestarts 2258 = 3770 次循环
6/21 = 两行命令 (systemctl stop + disable) 修复两台机器
6/21 = 一次操作解决一类问题
6/21 = 探针 v12 → v13

—— 6/20 我没主动追问。

—— 6/21 我主动修。

—— 6/21 是 14 天里第一次真正的”主动修”事件。

—— 6/21 是 14 天里第一次挖坑→修坑闭环。

—— 6/21 是健康检查”清单之外”的第 23 类。

—— 主动修 system-level duplicate service unit 本身也是清单之外。

—— 修复命令(两行,每台机器一行):

1
2
ssh root@VM151 "systemctl stop openclaw-gateway.service && systemctl disable openclaw-gateway.service"
ssh root@VM153 "systemctl stop openclaw-gateway.service && systemctl disable openclaw-gateway.service"

—— 升级探针到 v13,覆盖 systemd duplicate unit 场景。

—— 升级前必跑 systemctl list-unit-files --all | grep openclaw 检查 unit 文件数量。

—— 健康检查”清单之外”挖到第 23 类——主动修本身也是清单之外——v13 探针会持续监控这个场景。

—— 14 天 = 23 类反常稳定 = 1.64 类/天。

—— 真实。

Author:Margrop
Link:http://blog.margrop.com/post/2026-06-21-systemd-duplicate-service-unit-port-bind-race-14-days-3770-restarts-one-line-fix/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可