目录

OpenClaw Gateway 反复重启排障:auditd 定位 SIGTERM 发送者与 memory-pressure 自保护机制

从 7 次 SIGTERM 到 root cause 定位:systemd、hot-reload、memory-pressure 三者交织的完整复盘

事故现场:一个小时后回来的意外发现

2026 年 8 月 3 日中午,我离开电脑处理其他事情。一个小时后回来,发现 OpenClaw gateway 的日志里写满了 SIGTERM 信号——在 11:56 到 13:05 这短短约 1 小时内,gateway 经历了 7 次 stop/restart

没有任何异常告警,没有人工干预,整个系统像被"看不见的手"反复重启。直觉告诉我:这不是巧合,是有规律的底层问题正在暴露。

关键问题是:谁在发 SIGTERM?

重启事件时间线

排障第一步:收集所有日志

面对这种"幽灵重启",第一反应不是猜测,而是把所有能拿到的日志全部拉出来,对齐时间线

11:56 的首次重启——memory-pressure 触发的"自保"

通过 journalctl 查看 systemd 日志,发现最早的一次重启发生在 11:56

11:56:38 — Stopped openclaw-gateway.service
11:56:38 — Started openclaw-gateway.service

这看起来只是一个普通的 stop 然后 start。但深入检查 gateway 自己的日志,发现了关键线索:

11:56:39 [diagnostics/memory] rss_growth=45.26% (>30%); initiating restart

原来 OpenClaw gateway 内置了 内存诊断自保护机制:当 RSS 增长超过 30% 阈值时,自动触发 restart 来释放内存。11:56 这次重启的原因是 45.26% 的 RSS 增长,远超阈值。

“凶手"是系统自己的内存保护。

12:05 的配置热重载——agents.list 变更触发的连锁反应

接下来是 12:05 前后的事件,这是最复杂、也最耐人寻味的一条主线。

日志显示了一个精确的时间链:

12:04:06 — tool policy 应用(31/32 个工具被移除)
12:04:25 — tool policy 再次应用
12:05:03 — [reload] config change detected; evaluating reload (agents.list)
12:05:05 — received SIGTERM; restarting
12:05:10 — [reload] config hot reload applied (agents.list)
12:05:35 — restart drain 超时 30s,systemd 发送 SIGKILL
12:05:39 — 新 gateway 进程(node[214699])启动

关键发现:在 12:05:03,gateway 检测到 agents.list 配置发生了变更,触发了热重载流程。但仅仅 2 秒后(12:05:05),gateway 就收到了 SIGTERM。

更关键的证据是:在 12:05 这个时间点,存在一个配置备份文件

~/.openclaw/openclaw.json.bak-gateway-deny-20260803  (Modify: 12:05)

通过 diff 对比,发现当前配置对比备份文件,多个 agent 被追加了 "deny": ["gateway"] 规则。这说明有人在 12:05 精确修改了配置,添加了 gateway-deny 规则。

auditd 工作原理

12:06~13:05 的 5 次 SIGTERM 尚未定位

剩下的 5 次 SIGTERM 事件,目前仍无法通过现有日志直接定位来源:

时间事件类型来源确认
12:06:44stop(新进程启动后 66s)❌ 未知
12:31:01stop(systemd 自动重启)❌ 未知
12:41:40restart❌ 未知
12:49:22stop(用户手动拉起)❌ 未知
13:05:11stop(systemd 自动重启)❌ 未知

这也是为什么后来决定部署 auditd 的直接原因——日志只能告诉你"收到了信号”,但从不告诉你"谁发的信号"。

部署 auditd:让 SIGTERM 发送者"显形"

OpenClaw gateway 的日志只能记录"收到 SIGTERM,正在重启/停止"——它不知道是谁发的信号。systemd 的 journal 也只记录进程的 start/stop 状态,不记录信号的发送者。

要解决这个问题,必须引入 Linux 审计系统 auditd

安装与规则配置

# 安装 auditd
sudo apt-get install -y auditd && sudo systemctl enable --now auditd

# 监控 node 进程的执行(gateway 是 node 进程)
sudo auditctl -a always,exit -F path=/usr/bin/node -F perm=x -k openclaw_gateway_signal

# 监控 kill/tkill/tgkill 系统调用(64 位系统需要指定 arch)
sudo auditctl -a always,exit -F arch=b64 -S kill -S tkill -S tgkill -k openclaw_gateway_signal

注意:在 64 位系统上,监控 kill 系列系统调用必须指定 -F arch=b64,否则会报 WARNING - 32/64 bit syscall mismatch。另外,某些版本的 auditctl-F auid>=1000 的解析有兼容性问题,如果遇到 -F missing operation for auid 错误,可以先去掉 auid 过滤。

如何查看 auditd 捕获的日志

规则生效后,下一次 gateway 被 SIGTERM 时,可以通过以下命令查看发送者:

# 查看最近的事件
ausearch -k openclaw_gateway_signal --start recent

# 或查看原始日志
sudo ausearch -k openclaw_gateway_signal | aureport -f -i
日志覆盖范围对比

检查 search-scout-yuntianyan:受害者还是加害者?

在排查过程中,一个名为 search-scout-yuntianyan 的 agent 引起了注意——它的 session 文件显示在 12:05 前后有活跃轨迹。

通过检查它的 trajectory 文件(840140ce-0120-4ffd-832d-b041c9e59c37.trajectory.jsonl),发现:

  • 12:03:46 — session 还在正常运行,提交了新的 prompt
  • 12:04:06 — 完成了一次模型推理,但出现 "terminalError": "non_deliverable_terminal_turn"
  • 12:05:05 — gateway 重启,session 被中断

关键发现:search-scout-yuntianyan 的 trajectory 中没有任何 exec 工具调用包含 openclaw gatewaysystemctlgateway stop 等命令。它没有发出过任何 gateway 控制指令。

结论:这个 agent 是受害者,不是加害者。 它只是恰好在那段时间活跃,被 gateway 重启中断了工作。

确认的两条主线与待办清单

已确认的触发机制

触发时间触发源直接原因解决方向
11:56内存诊断自保护RSS 增长 45.26%,超过 30% 阈值调整阈值 or 排查内存泄漏
12:05agents.list 配置变更配置热重载触发重启流程追踪配置变更者,优化热重载流程

未确认的 SIGTERM(等待 auditd 捕获)

12:06/12:31/12:41/12:49/13:05 这 5 次 SIGTERM 的来源,仍需要 auditd 在下次事件发生时捕获。

根本原因是:

在全场景模式下加载了290个agetn导致内存飙升爆炸!

后续加固建议

  1. 调整 memory-pressure 阈值:如果 30% 过于敏感,可以适当放宽到 50%~60%,或增加冷却时间
  2. 配置变更审计:对于 agents.list 等关键配置,建立谁在什么时间修改的审计日志
  3. auditd 持久化规则:将 auditd 规则写入 /etc/audit/rules.d/,确保重启后仍然生效
  4. gateway drain 超时优化:30 秒的 drain 超时偏短,可考虑增加或优化 task draining 逻辑

排障方法论总结

这次排障给我最大的启发是:系统日志的"盲区"远比想象中多。

  • journalctl 只记录进程状态,不记录信号发送者
  • OpenClaw gateway 日志只记录信号接收,不记录来源
  • 普通运维工具无法捕获"谁杀了谁"的跨进程信息

auditd 是补全这个盲区的关键工具——它不依赖任何应用层的日志,直接在内核层面捕获系统调用,记录发送者的 PID、UID、命令等信息。

OpenClaw Gateway 重启排障

写在最后

gateway 反复重启看似是"抽风",但每次 SIGTERM 背后都有明确的触发机制。这次排障虽然找到了两条主线,但仍有 5 次 SIGTERM 的来源等待 auditd 的后续捕获。

如果你也在使用 OpenClaw 或类似的自托管 AI 网关,强烈建议:

  1. 提前部署 auditd,不要等到出了问题再装
  2. 关注 memory-pressure 阈值,结合你的实际负载调整
  3. 建立配置变更的审计链路,谁改了 agents.list 要有据可查

排障不是终点,加固才是。下一次 gateway 重启,我们就能知道是谁在"按开关"了。


关联阅读

  • [[2026-07-28-1530-openclaw-production-ops-full-review|OpenClaw 生产运维全面复盘]]
  • [[2026-06-04-1959-systemd-service-path排查|systemd service 路径排查记录]]
  • [[2026-07-27-1700-kb-writer-重复读取死循环事件|kb-writer 重复读取死循环事件排查]]