news 2026/9/18 2:27:21

vm0取消与超时恢复:stuck tool如何被SIGKILL收割而不泄漏资源

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
vm0取消与超时恢复:stuck tool如何被SIGKILL收割而不泄漏资源

vm0取消与超时恢复:stuck tool如何被SIGKILL收割而不泄漏资源

【免费下载链接】okouOkou connects to the tools your team already uses and does the work — across marketing, sales, engineering, and operations, under your control.项目地址: https://gitcode.com/GitHub_Trending/vm/okou

Okou(vm0)是一个开源 AI 工作流自动化平台,把任务放进独立的 Firecracker 微虚拟机里执行,并由 guest-agent 全程看管进程生命周期。本文带你读懂它的取消与超时恢复机制:当一个网络工具(如 WebFetch)卡死时,stuck tool 看门狗如何一步步升级到SIGKILL收割整个进程组,确保沙箱不泄漏任何资源。

为什么 AI Agent 会"卡住"?

Agent 执行任务时会调用 WebSearch、WebFetch 等网络工具。一旦某个请求挂起(对方服务器不响应、DNS 卡死、网络抖动),CLI 进程会一直等待,表现为:

  • 任务永远跑不完,沙箱被白白占用
  • 子进程、管道句柄、网络连接无人回收,形成"泄漏"
  • 用户取消(cancellation)时,如果 CLI 忽略了温和的终止信号,取消就像没发生

vm0 的解法是:看门狗定时巡检 + 信号逐级升级 + 进程组整体收割

🕵️ 看门狗:每 5 秒巡检一次未返回的工具

追踪逻辑在 StuckToolTracker:

  • CLI 每发出一个 WebSearch / WebFetch 调用,看门狗就记下调用 ID 和起始时间;
  • 一旦收到对应的tool_result,立即从表中移除;
  • 容量上限 256 条(MAX_TRACKED_STUCK_TOOLS),单条 ID 最长 1KB,防止异常子进程无限刷事件撑爆内存;
  • 表满了不驱逐旧条目——驱逐可能掩盖真正卡死的请求,宁可让新调用暂时无追踪(track_use)。

巡检节奏由两个常量决定(constants.rs):

常量默认值含义
STUCK_TOOL_TIMEOUT_SECS300 秒单次网络工具调用最长等待
STUCK_TOOL_CHECK_INTERVAL_SECS5 秒看门狗巡检间隔

主事件循环(select 分支)每秒级醒来时调用 oldest_expired,找出最早超时的那条调用。命中即判定:Tool timeout: WebFetch stuck for …,并触发终止流程。

📡 SIGTERM → SIGKILL:一次"先礼后兵"的状态机

真正决定怎么杀人的是 termination.rs 里的终止状态机,注释里画得很清楚(状态迁移表):

触发动作
Idle卡死被检出SigtermPending对整个进程组发SIGTERM,同时启动 SIGKILL 宽限期
SigtermPending宽限期到SigkillPending仍没退出?直接SIGKILL收割
SigkillPending宽限期到DoneSIGKILL 生效,流程收尾
任意 pending子进程主动退出Done不再发信号

两个设计细节值得新手注意:

  1. Done 是"粘性"的:迟到第二个type=result事件无法重新武装定时器,所有信号只发一次(should_arm_post_result),杜绝重复杀进程的竞态。
  2. 按进程组(pgid)发信号:不是只杀 CLI 本体,而是杀掉它 fork 出来的所有子孙进程。日志形如Tool timeout: WebFetch stuck for {elapsed}s, SIGTERM pgid={pgid}(ControlTerminationLog),这就是"不泄漏资源"的关键——孤儿进程无处藏身。

终止原因被完整记录为诊断信息,StuckTool对应的标签就是"stuck-tool watchdog"(TerminationReason::label),方便事后审计到底是执行超时、用户取消还是看门狗动手的。

✅ 用端到端测试证明"收割真的发生了"

这套机制不是纸上谈兵,仓库里有一组专门的集成测试来"逼"它走完升级链路:

  • stuck_tool_reap_sigkill.rs:mock CLI 故意忽略 SIGTERM,看门狗在 1 秒超时后先发 SIGTERM,宽限期内进程装死,随后被 SIGKILL 收割。测试断言终止原因正是StuckToolWatchdog、发出的信号是Sigkill、且标记了escalated
  • stuck_tool_stdout_eof_reap_sigkill.rs:stdout 意外断开时的收割路径;
  • 配套的取消恢复场景见 user_cancellation_recovery.rs 与 execution_timeout_recovery.rs。

更上游的"取消意图如何从 API 一路传到 Runner"的完整设计,可以读 run-cancellation-reconciliation.md——它描述了 cooperative(协作式)与 hard(硬取消)两种模式如何持久化、如何投递到沙箱。

📌 关键路径速查

模块相对路径
工具调用追踪(看门狗核心)crates/guest-agent/src/cli/claude.rs
终止状态机与信号策略crates/guest-agent/src/cli/termination.rs
主事件循环巡检分支crates/guest-agent/src/cli/mod.rs
超时/巡检间隔常量crates/guest-agent/src/constants.rs
进程组信号发送crates/guest-agent/src/cli/process_group.rs
取消对账官方文档docs/run-cancellation-reconciliation.md

一句话总结

vm0 用"有界追踪 + 定期巡检 + 信号逐级升级 + 进程组整体收割 + 端到端测试背书"五件套,把"stuck tool 卡死沙箱"这类最脏的边界情况变成了可审计、可复现、零泄漏的受控流程——这也是它能放心让 Agent 7×24 小时无人值守干活的安全底座。

【免费下载链接】okouOkou connects to the tools your team already uses and does the work — across marketing, sales, engineering, and operations, under your control.项目地址: https://gitcode.com/GitHub_Trending/vm/okou

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 2:26:25

Electron包体膨胀真相:从224MB到4.7MB的跨平台重构逻辑

1. 为什么 Electron 包体膨胀成了行业默认“税”?——从 224MB 到 4.7MB 的真实压缩逻辑你有没有打开过一个刚下载的桌面应用,点开安装包属性一看:224MB?再点开解压后的文件夹,发现光node_modules就占了 186MB&#xf…

作者头像 李华
网站建设 2026/9/18 2:25:05

Godot 录音 Demo 拆解:4 步把麦克风声音存成 WAV

Godot 录音 Demo 拆解:4 步把麦克风声音存成 WAV 【免费下载链接】godot-demo-projects Demonstration and Template Projects 项目地址: https://gitcode.com/GitHub_Trending/go/godot-demo-projects 这个官方 Demo 演示了 Godot 录音的最小完整链路&#…

作者头像 李华
网站建设 2026/9/18 2:23:55

AI 推理请求从 M8 Ultra 发出,TaoToken 只给 Key 和端点

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 2:23:09

容器化部署从入门到实战:Docker核心技术解析与踩坑指南

“容器化部署”这个词,这几年几乎成了后端开发和运维圈绕不开的话题。无论是新项目落地,还是老系统改造,只要聊到环境一致性、资源利用率、快速交付,最后基本都会落到 Docker 上。很多人第一次听到 Docker,可能是从一个…

作者头像 李华
网站建设 2026/9/18 2:22:12

IDEA中输出SQL的七种方法:日志配置、插件还原与脚本生成实战

平时排查接口问题,十次里有八次都要看SQL。你在IDEA里写Java项目,会写SQL只是基本功,能在日志里把SQL准确捞出来、带上参数还原成一条能直接执行的语句,这才是日常开发中最有价值的技能之一。这篇文章就把我在IDEA里弄出SQL语句的…

作者头像 李华
网站建设 2026/9/18 2:19:43

MySQL与Oracle核心差异:事务、分页、运维的实战分叉点

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华