プロセスガード

エージェントはプロセスを残していきます。
AgentsRoomがそれを見つけます。

AIコーディングエージェントは、呼び出すツールごとに本物のシステムプロセスを起動します。ほとんどは数秒で終わります。一部は永遠に終わらず、そういうプロセスが同時に数個あるだけで、マシンのメモリは埋まってしまいます。

プロセスガードはエージェントの子プロセスを走査し、メモリを食っているものを1つずつでも群れとしても通知し、原因となったエージェントの名前を示して、そのエージェントを中断できるようにします。あなたの知らないところで何かが終了させられることはありません。

プロセスガード
スキャン: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コーディングエージェントは1つのプロセスではありません。エージェントが呼び出すツールは、そのたびにあなたのマシンで本物のプロセスを起動します。検索、ビルド、型チェック、テスト実行、スクリプト。それを並行して動く数体のエージェント分、丸一日ぶん掛け合わせると、あなたが一度も目にしないまま生まれて葬られるプロセスが数百になります。

そのほとんどは終わります。問題は終わらないほうです。パターンが正規表現エンジンを爆発させてしまった検索は、クラッシュもしなければ遅くもなりません。メモリを確保し、圧縮メモリに押し出され、あとはカーネルがそのために数ギガバイトをスワップし続けるかたわらで、ページフォルトを起こし続けるだけの一生を送ります。終わることは永遠にありません。誰も殺してくれません。そして起動元のエージェントが閉じられると、マシン上の誰も責任を持たない孤児プロセスになります。

だから遅さはじわじわ忍び寄ります。どこかで派手に壊れるわけではなく、一日かけて積み上がるだけです。そしてこの形こそが、人に見当違いの犯人を疑わせます。熱暴走か、エージェントの数が多すぎるのか、アプリのメモリリークか。私たちが実測したセッションでは、アプリ自体は91プロセスで2.8 GB、8つのエージェントCLIは合わせて1.6 GBでした。どちらも原因ではありませんでした。

プロセスガードはセーフティネットです。エージェントが残していったものを監視し、どれがスタックしていて誰が起動したのかを伝え、終了させられるようにします。根本原因はこれからも変わり続けます。別のツール、別のパターン、別のプロバイダー。ネットのほうは変わらなくて済みます。

AIエージェントを動かすマシンが遅くなる理由

以下の数字は、8エージェントを動かした16 GBのノートPCでの実測セッションのものです。推定値は1つもありません。

マシンは5時間半動き続けていました。熱の問題はまったくありません。サーマルスロットリングの記録はゼロ、バッテリーは30.6度。ロードアベレージは8コアで17から21、CPUは56%の時間をカーネルで過ごし、アイドルは1.5%でした。この比率がすべてを物語ります。本当に仕事をしているマシンはユーザーコードに時間を使います。システム時間が56%のマシンは、メモリを圧縮し、展開し、スワップすることしかしていないカーネルです。

スタックした検索プロセス7件が、それぞれ3.9から8.0 GBを抱え、RAMが16 GBしかないマシンで合計41.8 GBを占有していました。スワップは23.5 GB中22.3 GB、起動以降におよそ993 GBがスワップに書き込まれていました。その7件を終了させたところ、エージェントを1つも再起動せず、アプリも再起動せずに、15.5 GBが即座に戻ってきました。

これを手作業で誰も捕まえられない理由は、いつものツールがこの件について嘘をつくからです。macOSでは、スタックしたプロセスが実際には8 GBを抱えているのに、レジデントメモリ20 MBと表示されることがあります。触れたものすべてがメモリコンプレッサーを通ったからです。私たちは動いているものを実際に計測し、実フットプリント14 GBに対してレジデントは4.7 GBでした。仮想サイズも役に立ちません。このプラットフォームではlaunchdでさえ約440 GBの仮想サイズを報告するので、そこで絞り込むとマシン全体が引っかかります。

一日、8エージェント、16 GB09:14
マシンのメモリすべて正常
スワップ11%
実測したセッションです。イメージ図ではありません。15.5 GB が即座に復帰

同じセッションを時間ごとに:もう誰も使っていないメモリの塊と、それを解放したときに何が起きるか。

41.8 GB
16 GBのマシンでスタックした7プロセスが占有
95%
スワップ使用率、23.5 GB中22.3 GB
21
8コアでのロードアベレージ、システム時間56%
993 GB
5時間半でスワップに書き込まれた量

そしてこれらのプロセスには、明日もまだそこに居座ることを保証する4つの性質があります。

終わることがない

自分のメモリがスワップに入っているので、計算する代わりにページフォルトで時間を使います。そのあいだアイドルなわけでもありません。私たちが実測した暴走プロセスは、それぞれ1コアの10〜19%を燃やし続けていました。しかも数が積み上がるほど、1つあたりの取り分は減っていきます。このスパイラルから抜け出す道はなく、どれだけ待っても何も変わりません。

死ぬこともない

ツール呼び出しにタイムアウトはありません。50分間アイドルのプロセスについて、マシン上の何ひとつ意見を持ちません。誰かが殺すか、マシンが再起動するまで、そこに居座り続けます。

起動元のエージェントより長生きする

エージェントのタブを閉じてもプロセスは生き残ることがあります。そして結びつきの切れ方はシステムごとに違います。古典的なUnixはinitに付け替え、Linuxデスクトップはsystemdのユーザーマネージャーに付け替え、Windowsはどこにも付け替えず、すでに存在しない親を指したまま放置します。だからプロセスガードは親を一切見ません。結びつきがまだあるうちに引き取ったものを記憶しておき、生きているプロセスツリーから消えたものはすべて孤児プロセスとして扱います。3つのシステムでまったく同じやり方です。実測した7件のうち2件は、すでにその状態でした。

積み上がっていく

検証パスごとに1つ、運の悪い検索ごとに1つ。さらに、遅いだけのコマンドを固まったと読み違えたエージェントが同じものをもう一度起動するたびに、また1つ増えます。私たちは、6体のエージェントが起動した12個の型チェックが同時に走っているのを実測しました。うち2体は3つを並行して抱えていました。だから遅さは一日を通して増える一方で、再起動すると直ったように見えます。何も直っていません。カウンターがゼロに戻っただけです。

プロセスガードがすること

エージェントが起動したプロセスを監視し、手を出す対象は意図的にごく狭く絞っています。

本当のメモリを測る

レジデントサイズではありません。それはスタックしたプロセスを数ギガバイト分も過小評価します。プロセスガードは圧縮されたページとスワップアウトされたページを含む実フットプリントを読むので、20 MBと表示しながら8 GBを抱えているプロセスもありのまま見えます。

プロセッサは測る、信用はしない

プロセッサ使用率は、システムツールが出す一生分の平均ではなく、2回のスキャンの間の変化率として読み取ります。だから、さんざん働いたあとで固まったプロセスもちゃんと捕まります。そしてこの値が決めるのは、まだ働いているものに課すハードルの高さだけで、免罪符にはなりません。1コアの5分の1を燃やし続ける暴走プロセスこそ、このプロセスガードの初代版が取り逃がしていたものです。

孤児プロセスを捕まえる

起動元のエージェントより長生きしたプロセスは、それ自体を理由に通知されます。ほかの誰も回収しないからです。所有関係はプロセスがまだ紐づいているうちに記憶されます。そこが確定できる唯一の瞬間だからです。

ワンクリックで終了

ステータスバーのチップが、スタックした各プロセスを、起動したエージェント、メモリ、経過時間、CPUとともに一覧にします。1つ終了させれば、それがフォークしたものも一緒に終わります。メモリはすぐに戻り、エージェントは動き続けます。

macOS、Windows、Linux

メモリについて本当のことを言うには、システムごとに違う測り方が要ります。macOSでは圧縮ページ、Linuxではレジデントとスワップアウト分、Windowsではプライベートコミット。3つとも実装済みで、予定ではありません。

コストはほぼゼロ

プロセスのスナップショットを1分に1回、824プロセスが動くマシンで約40 msという実測値です。高価なメモリ測定は、すでにスタックしていそうなものがあるときにしか走りません。エージェントが動いていない間はスキャン自体が走りません。

1つだけでなく、群れを見る

それぞれ1.4 GBの型チェックが12個あれば、16 GBのマシンで16.8 GBです。しかもその1つ1つは、まともなしきい値を下回っています。エージェントが起動したプロセスが合わせてマシンの物理メモリの半分を埋めた時点で、大きさはもう1つずつでは判定されません。

原因のエージェントを名指しする

同じエージェントから通知されたコマンドが2つ以上あれば、そのアバターの下にまとめ、合計で抱えている量と、どんなループに陥っているのかを説明する警告を添えます。コマンド1つなら事故ですが、同時に何個もあるならそれは振る舞いです。

プロセスだけでなく、エージェントを中断

エージェントがターンの途中にいるあいだにプロセスを終了させると、そのエージェントはエラーを受け取って反応し、たいていは同じコマンドをもう一度実行します。ボタン1つで、代わりにエージェントのターミナルへCtrl+Cを送れます。ターンはそこで終わり、何も再実行されず、エージェントは開いたままです。

オオカミ少年にならないための2つのルール

ビルドを通知してくる番人は、1週間で切られる番人です。だからハードルは意図的に高くしてあります。あなたが決めたしきい値より長く生きているエージェントの子プロセスは、すべて実メモリを測られ、あなたが許した量を超えて抱えていれば通知されます。まだプロセッサを使っているプロセスは、その2倍を抱えていなければなりません。長時間かかる正当なビルドが邪魔されずに済むのは、これがあるからです。

プロセッサ使用率が決めるのはそのハードルの高さであって、通すか通さないかの関門ではありません。このプロセスガードの初代版は、メモリを見る前にプロセスがアイドルであることを求めていました。それが間違いでした。パターンが正規表現エンジンを爆発させてしまった検索はアイドルではありません。カーネルがそのために数ギガバイトをスワップするかたわらで、1コアの5分の1を燃やし続けます。さらに悪いことに、数が積み上がるほど1つあたりのプロセッサの取り分は減ります。つまり死角がいちばん広かったのは、終了させるコストがいちばん安い最初の段階だったのです。

2つめのルールがあるのは、プロセスごとのハードルでは群れが見えないからです。それぞれ1.4 GBを抱えた12個の型チェックは、1つずつ見れば妥当で、まとめて見れば16 GBのマシンには致命的です。だから、エージェントが起動したものの合計がマシンの物理メモリの半分に達したときは、1つ1つの重さがどうであれ、そのすべてを通知します。このグループのものが自動で終了されることは決してありません。あなたが決めた上限を下回っていますし、通知されたのは隣にいるものたちのせいだからです。

仕組み

1分に1回、4ステップ。しかも高価なステップはほとんど走りません。

01

マシンの安価なスナップショットを1枚

毎分、プロセスガードは動作中の全プロセスのスナップショットを1枚だけ撮り、各エージェントターミナルの配下のツリーをたどります。824プロセスが動くマシンでの実測コストは約40 ms。エージェントが1つも動いていない間は、これ自体が起きません。

02

容疑者を絞り込む

そのスナップショットから、あなたが決めたしきい値より長く生きているエージェントの子プロセスをすべて残します。フィルターはそれだけで、まだプロセッサを使っているという理由で除外されるものはありません。それをやっていたからこそ、以前のバージョンは暴走プロセスを取り逃がしていました。通常の使い方ならこのリストは空です。エージェントのツール呼び出しは数秒で終わるからです。

03

スタックしていそうなものだけ測る

その短いリストに対してだけ、プロセスガードは圧縮ページとスワップアウトページを含む実メモリ測定のコストを払います。測れなかったプロセスが通知されることはありません。わからないことは判定ではないからです。

04

報告して、判断はあなたに任せる

ステータスバーにチップが現れ、通知が一度だけ知らせます。リストを開けば、そのプロセスが何で、どれだけ抱えていて、どれくらいスタックしていて、どのエージェントが起動したのかが見えます。終了させるかどうかはあなた次第です。

ガードレール

決して手を出さないもの

プロセスを終了できるツールは、自分の管轄をごく狭く定めなければなりません。ここに挙げる制限は構造的なもので、あなたが有効にするのを忘れられるようなオプションではありません。

  • エージェントのCLIそのもの。 どのプロバイダーを使っていても、プロセスガードはアプリがそのターミナルを起動するのに使ったバイナリを保護します。その名前はハードコードされた一覧からではなく起動そのものから読むので、同じCLIのサブプロセスも、どんな深さでも保護されます。
  • 開発コマンドのターミナル。 アイドル状態の開発サーバーは、暴走プロセスの条件をすべて満たします。大きく、古く、プロセッサを使っていない。しかもそれは、あなたが本当に動かしておきたい唯一のプロセスです。監視されるのはエージェントのターミナルだけなので、開発サーバーが視界に入ることはありません。
  • シェルとアプリ自身の配管。 ターミナルヘルパーと、エージェントが動いているシェルは、構造上除外されています。候補になりうるのは、エージェントCLIの配下にあるツールのプロセスだけです。
  • 自分で引き取っていないもの。 プロセスを終了できる唯一の経路は、プロセスガードがエージェント自身のツリーから拾っていないプロセスをすべて拒否します。あなたのマシンの別の何かを終了させる手段になることはありません。

そして、あなたが望まないかぎり自動で終了されるものは何もありません。既定ではプロセスガードは見つけたものを報告し、決めるのはあなたです。大きくて静かなプロセスが想定内かどうかを知っているのは、あなただからです。自動終了をオンにした場合でも、まだプロセッサを使っているものと、隣にいるものたちが抱えている量だけを理由に通知されたものには、手を出しません。

本領を発揮する場面

どれも実際にあった状況で、想像上の話は1つもありません。

朝9時より夕方6時のほうが遅いマシン

壊れた瞬間があるわけではなく、一日かけてじわじわ下がっていくだけ。この形はほぼ必ずスタックしたプロセスの蓄積で、どの瞬間を切り取っても異常に見えないぶん、手作業では最も診断しづらいものです。

複数のエージェントを並行で動かす

動かすエージェントが増えるほどツール呼び出しは増え、そのどれかが固まる可能性も増えます。1回あたりの失敗率はごくわずかですが、並行作業の一日を掛ければ、もうわずかではなくなります。

戻ってこない検索

正規表現エンジンを爆発させるパターンは、数百キロバイトのファイルに対して数ギガバイトを確保します。エージェントはそれを待ち、あなたはエージェントを待ち、マシンが両方の代金を払います。

エージェントを閉じたのに、プロセスは残った

タブを閉じても何かが解放されるとはかぎりません。すでに切り離されていたプロセスはメモリを抱えたまま、アプリから見える何かとの最後のつながりを失います。

16 GBのノートPC

RAMがたっぷりあるマシンなら、スタックしたプロセスが数件あっても長いあいだ隠れていられます。16 GBのノートPCではすぐにスワップに届き、システムがメモリを圧縮し始めた瞬間から、すべてのエージェントが一斉に遅くなります。

アプリを疑う前に

AgentsRoomを開いた状態でマシンが這うように遅くなれば、まずアプリが疑われます。プロセスごとの本当の数字が、それぞれを起動したエージェントとセットで手に入れば、疑いは実際に確かめられるものに変わります。

決めるのはあなた

限界を決めるのはあなた

既定値は意図的に慎重にしてあります。以下はすべて設定のターミナルタブにあり、どれもAgentsRoomのMCPツール経由でエージェントが読むことも変更することもできます。

エージェントの子プロセスを監視する
既定でオン。オフにすれば、スキャンは一切、二度と走りません。
メモリしきい値を超えたら通知する
既定で2ギガバイト。それ以下なら、スタックしたプロセスのためにあなたの手を止める価値はありません。RAMに余裕のあるワークステーションでは上げ、メモリが厳しいノートPCでは下げてください。
最低限の生存時間を過ぎてから
既定で5分。それより若いプロセスは、そもそも測られません。数秒で終わるふつうのツール呼び出しが完全に視界の外に置かれるのは、これがあるからです。
スタックしたプロセスを自動で終了する
既定でオフ。これは慎重さというより、意図した製品判断です。プロセスガードは判断を下していますが、大きくて静かなプロセスが想定内だったかを知っているのはあなただけです。オンにすれば自分で動き、事後に通知します。

プロセッサのしきい値は公開していませんし、マシンが飽和したとみなす基準も同じです。どちらも一度は間違っていて、好みではなく実際に起きた事象を計測して直したものです。どちらにスライダーを付けたところで、たいていは死角を元に戻す手段にしかなりません。

よくある質問

つまりAgentsRoomが私のコンピュータを遅くしているということ?

いいえ。そして、まさにそのためにこの機能があります。実測したセッションでは、アプリは91プロセスで2.8 GB、8つのエージェントCLIは合わせて1.6 GBでした。41.8 GBを抱えていたのは、固まったツールのプロセスです。AgentsRoomはたまたま、すべてのエージェントとそれが起動したすべてのプロセスを見られる唯一の場所なので、判定を下せる唯一の場所でもあります。

ビルドやテスト実行を殺してしまわない?

確認なしに終了させることは決してありません。通知することはあります。ビルドが通知されるのは、あなたのしきい値の2倍、既定では4ギガバイトを抱えている場合か、マシンのメモリの半分を埋めているエージェントプロセスの一群に含まれている場合です。ただし自動終了は、まだプロセッサを使っているプロセスにも、隣にいるものたちが抱えている量だけを理由に通知されたプロセスにも、決して手を出しません。どちらの場合も、あなたの手元に来るのは1行の表示と実際の数字とボタンだけで、押すまで何も起きません。

開発サーバーも監視される?

いいえ。これからもしません。アイドル状態の開発サーバーは暴走プロセスの条件をすべて満たします。メモリをたくさん抱え、何時間も動き続け、リクエストの合間はプロセッサを使いません。監視されるのはエージェントターミナルの子プロセスだけなので、開発コマンドは構造上、対象外です。

エージェント自体を終了させてしまうことはある?

いいえ。エージェントのCLIは、どのプロバイダーを使っていても保護されます。保護の根拠は既知の名前の一覧ではなく、アプリがそのターミナルを起動するのに使ったバイナリです。シェルとアプリ自身のターミナルヘルパーも同様に除外されています。

孤児プロセスとは何で、なぜ特別扱いされるの?

親が終了したプロセスは、起動したエージェントとの結びつきを失い、もう誰も片付けてくれません。その結びつきの切れ方はシステムによって違います。古典的なUnixはinitに付け替え、Linuxデスクトップはsystemdのユーザーマネージャーに付け替え、Windowsはどこにも付け替えず、死んだ親のIDを残すだけです。だからAgentsRoomは親を一切調べません。プロセスがまだ紐づいているうちに所有関係を記録します。そこが確定できる唯一の瞬間だからです。そして、生きているプロセスツリーから消えたものはすべて孤児プロセスとして扱います。3つのシステムでまったく同じやり方です。

監視そのもののコストは?

プロセスのスナップショットを1分に1回、824プロセスが動くマシンで約40 msという実測値です。より高価なメモリ測定は、すでにスタックしていそうなプロセスにしか走らないので、通常の使い方では走らないということです。そしてエージェントが動いていない間は、スキャン自体が存在しません。

アクティビティモニタのメモリ欄を見ればいいのでは?

macOSではその欄が問題を1桁分も小さく見せるからです。圧縮メモリに押し出されたプロセスは、8 GBを抱えながらレジデント20 MBと表示されることがあります。私たちは動いているものを実際に計測し、実フットプリント14 GBに対してレジデントは4.7 GBでした。仮想サイズも同じくらい役に立ちません。システムプロセスでさえ数百ギガバイトを報告します。

Claude CodeやCodex、ほかのツールでも動く?

はい。プロセスガードは特定のツールやプロバイダーについて何も知りません。あなたが起動したエージェントターミナルの子プロセスを監視し、保護するCLIは起動そのものから読み取ります。プロバイダーが増えても、ここは何も変わりません。

WindowsとLinuxでも動く?

はい。メモリを正直に測るには、プラットフォームごとに違う測り方が要ります。macOSでは圧縮ページ、Linuxではレジデントとスワップアウト分、Windowsではプライベートコミット。3つとも実装済みです。

確認なしにプロセスを終了させることはある?

あなたがその設定をオンにしないかぎりありません。既定では、見つけたものをエージェント、メモリ、経過時間、プロセッサ使用率とともに報告し、決めるのはあなたです。自動終了は設定項目で、初期状態ではオフです。

自分のプロセスを終了させられたエージェントはどうなる?

エージェントは動き続けます。そのツール呼び出しは永遠に固まる代わりにエラーを受け取ります。それが望ましい結果です。どのみちそのプロセスが終わることはなかったからです。何も再起動されず、コンテキストも失われません。

根本原因は直る?

いいえ。直そうともしていません。原因は変わります。今日はあるツール、明日は別のパターン、来月は別のプロバイダー。これはセーフティネットであり、まだ誰も見たことのない原因が来ても動き続けるように作られています。

プロセスが12個あって、どれ1つ私のしきい値を超えていません。それでも何か言ってくれますか?

はい。そして、まさにその場合のためにルールを変えました。16 GBのマシンでの実測です。6体のエージェントが起動した12個の型チェックが、それぞれ0.84〜1.72 GB。どれも2 GBのしきい値をゆうに下回っていましたが、合計は15.4 GBで、スワップは満杯、マシンは使い物になりませんでした。1つずつ判定すれば、どれもまったく問題ありません。合計が物理メモリの半分を超えた時点で、そのすべてが、起動したエージェントごとにまとめて通知されます。

「エージェントを中断」は実際には何をするのですか?

そのエージェントのターミナルにCtrl+Cを送ります。あなたが自分で押すのとまったく同じキー操作です。エージェントの現在のターンはそこで終わり、あなたの入力を待ちます。閉じられることはなく、セッションもそのまま、マシン上のほかの何にも手は触れません。この機能があるのは、エージェントがまだ作業している最中にプロセスだけを終了させても対症療法にしかならないからです。エージェントはエラーを受け取り、しばしば同じコマンドをそのまま実行し直します。

こちらもおすすめ

誰も使っていないプロセスに払い続けるのをやめる

AgentsRoomは無料でダウンロードでき、プロセスガードは初回起動から有効です。

無料AgentsRoomをダウンロード

コンパニオンアプリ:外出先でもエージェントを確認

Claude、Codex、Antigravity CLI、またはその他の AI プロバイダーを使用します。

拡張機能を入手
Chrome Web Store

バグや要望を公開バックログに直接送信できます。

マルチプロジェクト
マルチプロバイダー
マルチエージェント
ライブステータス
ファイル差分
モバイルアプリ
ライブプレビュー
エージェントチーム
ブラウザテスト
バックログ駆動開発
プロンプトライブラリ
スキルライブラリ
すべての機能を見る