进程守卫

你的智能体会留下进程。
AgentsRoom 把它们找出来。

AI 编程智能体每调用一个工具,就会在系统里启动一个真实进程。绝大多数几秒就结束了。有些永远不会结束,而这样的进程同时跑上几个,就足以把一台机器的内存填满。

进程守卫扫描智能体的子进程,把吃你内存的标出来,单独一个也好,一大群也好,指出该由哪个智能体负责,并让你打断它。不会有任何东西在你不知情的时候被终止。

进程守卫
扫描:每分钟 1 次
Full-Stack Dev 的子进程
ripgrep18 MB
71%
tsc --noEmit1.4 GB
96%
search6.4 GB
3%
node2.1 GB
0%
2 个卡住的进程
占用 6.4 GB,CPU 0%
已卡住 23 分钟,毫无进展
由 Full-Stack Dev 启动
结束该进程
够久就测量。够大,或者一次太多,就上报。内存立刻回来

进程守卫真正在看的东西:一个智能体启动了哪些进程,其中哪些已经不干活了。

AI 编程智能体不是一个进程。它每调用一次工具,就在你的机器上启动一个真实进程:一次搜索、一次构建、一次类型检查、一轮测试、一个脚本。把这个数字乘上几个并行工作的智能体,再乘上一整天,你会得到几百个从生到死你一眼都没看见的进程。

它们几乎都会结束。麻烦的是不会结束的那些。一次搜索的匹配模式把正则引擎撑爆了,它既不崩溃也不变慢:它先申请内存,被挤进压缩内存,然后余生就在不停地缺页,而内核在旁边为它换出好几个 GB。它永远不会结束。也永远不会有人杀掉它。而如果启动它的智能体被关掉,它就变成一个整台机器上再没人负责的孤儿进程。

所以变慢是悄悄爬上来的。没有哪一刻突然崩掉,只有一整天缓慢的累积,而恰恰是这个形状让人怪错了对象:以为是过热,是智能体开太多,是应用内存泄漏。在我们实测的那次会话里,应用自己是 91 个进程占 2.8 GB,八个智能体 CLI 加起来 1.6 GB。两个都不是问题所在。

进程守卫是那张安全网。它盯着智能体留下的东西,告诉你哪个卡住了、是谁启动的,然后让你把它结束掉。根本原因会一直变:换个工具,换个匹配模式,换个提供方。而这张网不需要跟着变。

跑 AI 智能体的机器为什么会变慢

下面的数字来自一台 16 GB 笔记本上跑着八个智能体的实测会话。这里没有一个是估算值。

机器已经开了五个半小时。完全没有散热问题:没有记录到任何降频,电池 30.6 摄氏度。8 核上的平均负载在 17 到 21 之间,CPU 有 56% 的时间待在内核态,空闲只剩 1.5%。这个比例才是破绽。真正在干活的机器,时间花在用户态代码上;系统时间占 56% 的机器,是一个除了压缩、解压和换出内存之外什么都没干的内核。

七个卡住的搜索进程每个占着 3.9 到 8.0 GB,在一台只有 16 GB RAM 的机器上一共占了 41.8 GB。交换空间用掉 23.5 GB 中的 22.3 GB,开机以来往交换空间写了大约 993 GB。结束这七个进程,15.5 GB 立刻回来了,没有重启任何一个智能体,也没有重启应用。

没人能靠手工抓住这件事,是因为常用工具在这上面撒谎。在 macOS 上,一个卡住的进程实际占着 8 GB,却可能只显示 20 MB 的常驻内存,因为它碰过的一切都进了内存压缩器。我们实测过一个还活着的进程:常驻内存 4.7 GB,真实占用 14 GB。虚拟内存大小也帮不上忙:在这个平台上连 launchd 都报告约 440 GB 的虚拟大小,拿它来筛等于把整台机器都标出来。

一个工作日,八个智能体,16 GB09:14
机器内存一切正常
交换空间11%
实测的一次会话,不是示意图。15.5 GB 立刻回来

同一次会话,逐小时看:那些再也没人用的大块内存,以及释放之后发生了什么。

41.8 GB
被 7 个卡住的进程占用,机器只有 16 GB
95%
交换空间已用,23.5 GB 中的 22.3 GB
21
8 核上的平均负载,系统时间占 56%
993 GB
五个半小时里写入交换空间的量

而且这些进程有四个特性,保证它们明天还在。

它们永远不会结束

它们自己的内存在交换空间里,于是时间全花在缺页上而不是计算上。而且它们并不是闲着:我们实测的那些失控进程,每一个都在烧掉一个核的 10% 到 19%,而且堆得越多,每个分到的越少。这个循环没有出口,再等下去也不会变。

它们也永远不会死

工具调用没有超时。对于一个已经闲了五十分钟的进程,机器上没有任何东西持有意见。它会一直待在那里,直到有人杀掉它,或者机器重启。

它们比自己的智能体活得久

关掉智能体标签页,进程可能活下来。而这层关系断掉的方式,每个系统都不一样:经典 Unix 会把它过继给 init,Linux 桌面会过继给你的 systemd 用户管理器,Windows 则根本不过继,只留下一个指向早已不存在的父进程的编号。所以进程守卫从不去看父进程。它在关系还在的时候就记住自己认领了什么,凡是从活着的进程树里消失的,一律当作孤儿进程处理,三个系统上做法完全相同。我们实测的七个里,有两个已经是这个状态。

它们会越堆越多

每跑一轮校验多一个,每碰上一次倒霉的搜索多一个,而每当一个智能体把一条只是慢的命令当成卡住了、又重新跑一遍,就再多一个。我们实测到十二个类型检查同时在跑,由六个智能体启动,其中两个各自手上就挂着三个。所以变慢在一天之内只增不减,所以重启看起来像是解决了问题。它什么都没解决,只是把计数清零了。

进程守卫做什么

它盯着你的智能体派生出来的进程,而且对自己愿意碰哪些,管得刻意地窄。

测的是真实内存

不是常驻内存,那个值会把一个卡住的进程少算好几个 GB。进程守卫读的是真实占用,把压缩页和换出页都算进去,所以一个显示 20 MB、实际抱着 8 GB 的进程会露出本来面目。

测处理器,但从不相信它

处理器占用是两次扫描之间的速率,不是系统工具报出来的那个整个生命周期的平均值,所以一个先猛干一阵、然后卡死的进程照样会被抓到。它换来的只是给还在干活的东西抬高门槛,绝不是一张免死金牌:一个烧掉五分之一个核的失控进程,恰恰是这个守卫的第一版会漏掉的东西。

抓得住孤儿进程

一个活得比启动它的智能体还久的进程,凭这一点本身就会被报出来,因为再没有别人会来回收它。归属关系是在进程还挂在树上的时候记下来的,那是唯一能确认它的时刻。

一键结束

状态栏里的提示条会列出每个卡住的进程,连同派生它的智能体、内存、存活时间和 CPU。结束其中一个,会连它自己派生的东西一起终止。内存立刻回来,你的智能体照常运行。

macOS、Windows 和 Linux

要把内存说清楚,每个系统都需要不同的测法:macOS 看压缩页,Linux 看常驻加换出,Windows 看私有提交。三个都已经实现,不是计划中。

几乎不花什么代价

每分钟一次进程快照,在一台跑着 824 个进程的机器上实测约 40 毫秒。昂贵的内存探测只在已经有东西看起来卡住时才跑,而只要没有智能体在活动,扫描根本不会发生。

看见一群,不只看冒尖的那个

十二个各占 1.4 GB 的类型检查,在一台 16 GB 的机器上就是 16.8 GB,而它们每一个都落在一个合理的阈值以下。当你的智能体启动的这些进程加起来填满机器物理内存的一半,大小就不再一个一个单独判断了。

点名该负责的智能体

同一个智能体名下有两条以上被标记的命令时,它们会被归到这个智能体的头像下面,附上它们合起来占了多少,以及一条说明它们陷入了什么循环的警告。一条命令是意外,一次好几条就是行为模式。

打断智能体,不只是打断进程

在智能体这一轮还没结束的时候结束它的进程,等于递给它一个错误,而它会对这个错误做出反应,通常就是把命令再跑一遍。有一个按钮改为向智能体的终端发送 Ctrl+C:这一轮就此结束,什么都不会重跑,智能体也仍然开着。

让它不至于狼来了的两条规则

一个会标记你构建的守卫,是你一周之内就关掉的守卫,所以门槛是刻意抬高的。凡是活得比你设的阈值更久的智能体子进程,都会被测出真实内存,一旦占用超过你允许的量就上报。还在使用处理器的进程必须占到那个量的两倍,正是这一条让一次漫长而正当的构建不被打扰。

处理器占用决定的是这道门槛的高度,它不是一道闸门。这个守卫的第一版要求一个进程先闲下来,才肯去看它的内存,那是错的。一次把正则引擎撑爆的搜索并不闲:它一边烧掉五分之一个核,一边让内核为它换出好几个 GB。更糟的是,这类进程堆得越多,每个能分到的处理器越少,于是盲区最大的时候恰恰是最开始,也就是结束掉一个代价最小的时候。

第二条规则的存在,是因为按进程逐个设的门槛看不见一群。十二个各占 1.4 GB 的类型检查,单看每一个都合理,合起来在一台 16 GB 的机器上却是致命的。所以当智能体启动的所有东西加起来达到机器物理内存的一半时,不管每一个各自多重,它们全部都会被上报。这一组里的任何东西都绝不会被自动结束:它们本来就低于你设的上限,被标出来只是因为旁边的邻居。

它怎么工作

四步,每分钟一次,而且最贵的那步几乎从不执行。

01

给机器拍一张便宜的快照

每分钟,进程守卫给所有运行中的进程拍一张快照,然后沿着每个智能体终端往下走整棵进程树。在一台跑着 824 个进程的机器上实测成本约 40 毫秒。只要没有智能体在运行,这一步根本不发生。

02

圈出嫌疑对象

从那张快照里,它保留每一个活得比你设的阈值更久的智能体子进程。筛选就这一条,不会因为还在使用处理器就被排除:以前那个版本的守卫漏掉失控进程,正是这么漏的。正常使用下这份名单是空的,因为智能体的工具调用几秒就结束了。

03

只测看起来卡住的那几个

只有对这份短名单,进程守卫才会付出真实内存测量的代价,把压缩页和换出页算进去。测不出来的进程绝不会被标记:不知道不等于判决。

04

报告,然后让你决定

状态栏出现一个提示条,一条通知只提醒你一次。你打开列表,看到这个进程是什么、占了多少、卡了多久、由哪个智能体启动,然后你想结束就结束。

安全边界

它永远不会碰的东西

一个能结束进程的工具,必须把什么算自己的事定得很窄。下面这些限制是结构性的,不是需要你记得去打开的选项。

  • 智能体 CLI 本身。 无论你用哪个提供方,进程守卫都会保护应用启动那个终端时用的可执行文件。这个名字是从启动动作本身读出来的,不是来自一份写死的清单,所以同一个 CLI 的子进程同样受保护,无论嵌套多深。
  • 你的开发命令终端。 一个闲着的开发服务器满足失控进程的每一条判据:占内存、活得久、不用处理器。它同时也是你真正希望它一直跑着的那个进程。只有智能体终端会被监视,所以你的开发服务器从来不在画面里。
  • Shell 和应用自己的管道。 终端辅助进程,以及智能体所在的 shell,在设计上就被排除。只有位于智能体 CLI 之下的工具进程才有可能成为候选。
  • 任何不是它认领的东西。 唯一能结束进程的那条路径,会拒绝一切不是进程守卫从某个智能体自己的进程树里捡到的进程。它没法变成一个终止你机器上别的东西的手段。

而且除非你主动要求,否则没有任何东西会被自动结束。默认情况下进程守卫只报告它发现了什么,由你来决定,因为只有你知道一个又大又安静的进程是不是本该如此。就算你把自动终止打开,它也不会去碰还在使用处理器的东西,也不会去碰那些仅仅因为邻居占了多少才被标出来的东西。

它什么时候值回票价

下面每一条都是真实发生过的情况,没有一条是假设。

下午六点比早上九点更卡的机器

没有哪一刻突然坏掉,只有一整天稳定的下滑。这个形状几乎总是卡住的进程堆积出来的,也是最难靠手工诊断的一种,因为随便挑哪个瞬间看都不像有问题。

几个智能体同时在干活

你跑的智能体越多,工具调用就越多,其中某一次卡死的机会也越多。单次调用的失败率很小;乘上一整天的并行工作,它就不小了。

一次再也没回来的搜索

一个撑爆正则引擎的匹配模式,会为一个几百 KB 的文件申请好几个 GB。智能体在等它,你在等智能体,而机器替这两头付账。

你关了智能体,进程还在

关掉一个标签页不一定释放任何东西。一个早已脱离的进程会带着它的内存留下来,同时失去和应用里任何可见事物的最后一点联系。

一台 16 GB 的笔记本

在 RAM 充裕的机器上,几个卡住的进程能藏很久。在 16 GB 的笔记本上它们很快就把交换空间顶满,而一旦系统开始压缩内存,你的每一个智能体都会同时变慢。

在怪罪应用之前

机器爬得动不了,而 AgentsRoom 正开着,应用就是最显眼的嫌疑对象。手里有逐个进程的真实数字,还有每个进程是由哪个智能体启动的,猜测就变成了可以真正核实的东西。

你说了算

界限由你来定

默认值刻意保守。下面这些都在设置的终端一栏里,而且每一项都可以由智能体通过 AgentsRoom 的 MCP 工具读取和修改。

监视智能体的子进程
默认开启。关掉它,扫描就一次都不会跑,永远不会。
超过内存阈值才报告
默认两个 GB。低于这个数,一个卡住的进程不值得打断你。RAM 充裕的工作站可以调高,内存紧张的笔记本可以调低。
存活时间达到下限之后
默认五分钟。不到这个时间的进程根本不会被测量,正是它让智能体那些几秒就结束的日常工具调用彻底不进入视野。
自动结束卡住的进程
默认关闭,这是一个明确的产品决定,不只是谨慎。进程守卫下的是一个判断,而只有你知道一个又大又安静的进程是不是本该如此。打开它,它就自己动手,事后给你一条通知。

处理器阈值没有开放出来,机器算作饱和的那个临界点也一样。这两个值都曾经错过一次,是靠测量真实发生的事故而不是靠口味修好的,所以给任何一个加上滑块,多半只会把盲区重新放回去。

常见问题

这是不是说 AgentsRoom 会拖慢我的电脑?

不是,而这恰恰是这个功能存在的原因。在我们实测的那次会话里,应用是 91 个进程占 2.8 GB,八个智能体 CLI 加起来 1.6 GB。那 41.8 GB 是被卡死的工具进程占着的。AgentsRoom 刚好是唯一能同时看到每个智能体和它派生的每个进程的地方,所以也是唯一能做出判定的地方。

它会不会把我的构建或者测试杀掉?

它绝不会不问你就结束一个。它可能会上报:一次构建要么占到你阈值的两倍,默认是四个 GB,要么属于一群加起来填满你机器一半内存的智能体进程。但自动终止绝不会碰一个还在使用处理器的进程,也绝不会碰一个仅仅因为邻居占了多少才被标出来的进程。两种情况下你看到的都是一行记录、真实数字和一个按钮,你不按就什么都不会发生。

它会监视我的开发服务器吗?

不会,以后也不会。一个闲着的开发服务器满足失控进程的每一条判据:占着很多内存、已经跑了好几个小时、两次请求之间不用处理器。只有智能体终端的子进程会被监视,所以你的开发命令在设计上就在范围之外。

它会不会把智能体本身给终止了?

不会。无论你用哪个提供方,智能体 CLI 都受保护,而这个保护依据的是应用启动那个终端时用的可执行文件,不是一份已知名字的清单。Shell 和应用自己的终端辅助进程同样被排除在外。

什么是孤儿进程,为什么要特别对待它?

父进程已经退出的进程,会失去和启动它的那个智能体之间的关联,也就再没人会来清理它。这层关系怎么断,取决于系统:经典 Unix 会把它过继给 init,Linux 桌面会过继给你的 systemd 用户管理器,Windows 则不做任何过继,只留下一个已经失效的父进程编号。所以 AgentsRoom 从不去检查父进程。它在进程还挂在树上的时候就记下归属关系,那是唯一能确认它的时刻,而凡是从活着的进程树里消失的,一律当作孤儿进程处理,三个系统上完全一样。

监视本身要花多少代价?

每分钟一次进程快照,在一台跑着 824 个进程的机器上实测约 40 毫秒。更贵的那次内存测量只对已经看起来卡住的进程执行,也就是说正常使用下它不会执行。而且只要没有智能体在活动,这个扫描根本不存在。

为什么不直接看活动监视器里的内存那一列?

因为在 macOS 上,那一列把问题少算了一个数量级。一个被挤进压缩内存的进程,可能抱着 8 GB 却只显示 20 MB 常驻内存。我们实测过一个还活着的进程:常驻 4.7 GB,真实占用 14 GB。虚拟内存大小也好不到哪去:连系统进程都会报出好几百 GB。

它对 Claude Code、Codex 这些都管用吗?

管用。进程守卫对任何具体的工具或提供方一无所知。它盯的是你启动的那个智能体终端的子进程,而它要保护的 CLI 是从启动动作本身读出来的。多接一个提供方,这里什么都不用改。

在 Windows 和 Linux 上也能用吗?

能用。要让内存说实话,每个平台都需要不同的测法:macOS 看压缩页,Linux 看常驻加换出,Windows 看私有提交。三个都已经实现。

它会不问我就结束进程吗?

除非你把那个开关打开,否则不会。默认情况下它把发现的东西报告给你,连同智能体、内存、存活时间和处理器占用,由你决定。自动终止是一个设置项,出厂就是关着的。

我结束了某个进程,那个智能体会怎么样?

智能体照常运行。它那次工具调用会收到一个错误,而不是永远挂在那里,这正是你想要的结果:反正那个进程本来也不会结束。什么都不会被重启,上下文也不会丢。

它能解决根本原因吗?

不能,它也不打算解决。原因是会变的:今天是某个工具,明天是另一个匹配模式,下个月是另一个提供方。这是一张安全网,它被设计成在遇到谁都没见过的原因时依然管用。

十二个进程,没有一个超过我设的阈值。它会说点什么吗?

会,而规则改掉正是因为这种情况。在一台 16 GB 的机器上实测:六个智能体启动了十二个类型检查,每个 0.84 到 1.72 GB,全都远低于 2 GB 的阈值,加起来 15.4 GB,交换空间满了,机器没法用了。一个一个地看,每一个都没问题。一旦总和超过你物理内存的一半,它们就会全部被上报,并按启动它们的智能体归到一组。

“打断智能体”到底做了什么?

它向那个智能体的终端发送 Ctrl+C,和你自己按下去的是同一个按键。智能体当前这一轮就此结束,然后等你:它没有被关掉,会话完好无损,你机器上别的任何东西都不会被碰。这个按钮存在,是因为在智能体还在处理的时候只结束进程,治的只是症状:智能体收到一个错误,往往就把命令再跑一遍。

你可能还喜欢

别再为没人用的进程买单

AgentsRoom 免费下载,进程守卫从第一次启动就是开着的。

免费下载 AgentsRoom

配套应用:随时随地监控你的 Agent

使用 Claude、Codex、Antigravity CLI 或其他 AI 提供商。

获取扩展程序
Chrome Web Store

把 Bug 和需求直接发送到您的公开待办清单。

AgentsRoom 实际运行一瞥。

多项目管理
多供应商
多代理运行
实时状态
文件差异与提交
移动应用
实时预览
代理团队
浏览器自动化
Backlog 驱动开发
提示词库
技能库
查看所有功能