进程守卫

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

AI 编程智能体每调用一个工具,就会在系统里启动一个真实进程。绝大多数几秒就结束了。有些永远不会结束,它们一点 CPU 都不用,却把好几个 GB 的内存扣着不还。

进程守卫扫描智能体的子进程,标出不再有进展的那些,指出该由哪个智能体负责,让你一键结束。不会有任何东西在你不知情的时候被终止。

进程守卫
扫描:每分钟 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 启动
结束该进程
又大 + 又久 + CPU 不动。三条同时满足才报,否则一声不吭。内存立刻回来

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

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

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

所以变慢是悄悄爬上来的。没有哪一刻突然崩掉,只有一整天缓慢的累积,而恰恰是这个形状让人怪错了对象:以为是过热,是智能体开太多,是应用内存泄漏。在我们实测的那次会话里,应用自己是 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
五个半小时里写入交换空间的量

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

它们永远不会结束

它们自己的内存在交换空间里,于是时间全花在缺页上而不是计算上。一次健康的搜索会跑满一个核;这些只有 4%。这个循环没有出口,再等下去也不会变。

它们也永远不会死

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

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

关掉智能体标签页,进程可能活下来,被过继给 init 进程。到那一步,它和任何东西都不再有关联:它是孤儿进程,再没人会来回收。我们实测的七个里,有两个已经是这个状态。

它们会越堆越多

每跑一轮校验多一个,每碰上一次倒霉的搜索多一个。所以变慢在一天之内只增不减,所以重启看起来像是解决了问题。它什么都没解决,只是把计数清零了。

进程守卫做什么

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

测的是真实内存

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

不只看 RAM,也看 CPU

光看内存的话,你机器上每一次构建都会被标出来。进程守卫把处理器占用测成两次扫描之间的速率,所以一个先猛干一阵、然后卡死的进程照样会被抓到,而真正在干活的构建会被放过。

抓得住孤儿进程

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

一键结束

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

macOS、Windows 和 Linux

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

几乎不花什么代价

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

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

一个会标记你构建的守卫,是你一周之内就关掉的守卫。所以一个进程绝不会仅凭内存被报出来。它必须够大,必须已经活了一阵子,而且必须已经不再使用处理器。三条同时成立。

干活的是第三条。类型检查或者打包器同样会抱着好几个 GB 好几分钟,但它们在这期间跑满一个核。一个陷在交换空间里的进程只有 4% 上下,因为它的一生都花在等缺页而不是计算上。这个差距把一台在干活的机器和一台在下沉的机器分开,也是唯一能可靠区分两者的信号。

处理器占用同样是测出来的,不是读出来的。系统工具给的那个常见数字是整个进程生命周期的平均值,所以一个干了二十分钟然后卡死的进程看上去依然很忙。进程守卫比较的是两次扫描之间消耗的处理器时间,所以它看到的是最近一分钟,不是最近一小时。

它怎么工作

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

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 刚好是唯一能同时看到每个智能体和它派生的每个进程的地方,所以也是唯一能做出判定的地方。

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

不会。一个进程只有在够大、并且够久、并且已经不再使用处理器的时候才会被标记。真正在干活的构建会跑满一个核,所以过不了第三条,永远不会成为候选。这个条件的存在就是为了做出这个区分。

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

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

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

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

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

父进程已经退出的进程,会被过继给系统的 init 进程。从那一刻起,它和启动它的智能体之间再没有任何关联,于是没人会来清理它。AgentsRoom 会在进程还挂在树上的时候记住归属关系,那是唯一能确认它的时刻,所以之后它依然能报出这个进程。

监视本身要花多少代价?

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

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

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

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

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

在 Windows 和 Linux 上也能用吗?

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

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

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

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

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

它能解决根本原因吗?

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

你可能还喜欢

别再为没人用的进程买单

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

免费下载 AgentsRoom

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

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

获取扩展程序
Chrome Web Store

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

AgentsRoom 实际运行一瞥。

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