【AIエージェントの暴走を阻止】起動した子プロセスを根こそぎ終了させるツール「Corral」を作ってみた
Show HN: Corral – Kill every command your agent starts
Show HN: Corral – Kill every command your agent starts
今年の夏、AIエージェントのバックエンド開発のインターンをしていた際、エージェントが「tail -f」や謎のバックグラウンドジョブを実行したまま放置し、終了処理を行わないという問題に気づきました。気になってClaude Codeがどう対処しているのか調べたところ、彼らも似たような課題を抱えていることがわかりました。Bashツールがセッション終了時にバックグラウンドプロセスをクリーンアップできなかったり、タイムアウト時にプロセスグループ全体にSIGTERMを送信してしまい、結果としてClaude Code自体が終了してしまうといった事象が発生しています。多くのランナーは自分が起動したプロセスしか終了させないため、ダブルフォークやバックグラウンド実行、あるいはstdoutを開きっぱなしにするプロセスは生き残り続け、結果としてランナー自体がハングアップしてしまうのです。この問題を解決しつつ、Linuxのプロセスとシグナルについて学ぶために開発したのが「Corral」です。「corral --wall 30s -- yourcommand」のように実行すれば、処理完了後にその配下で起動したすべてのプロセスを確実に終了させることができます。実行コマンドには独自のセッションが割り当てられるため、自分自身が停止することはありません。また、専用のcgroup内で実行するモードを使えば、セッションやプロセスグループを変更したプロセスを含め、プロセスツリー全体をまとめて終了させることが可能です。cgroupが使えない環境では、/proc経由でツリーを追跡します(これは少し制限があり、ユーザーが異なるプロセスやsystemdのような別のサービスに渡されたプロセスは対象外ですが、親プロセスが死んだ後にセッションを移動したプロセスは捕捉可能です)。もし全プロセスの停止を確認できない場合は、終了コード120を返す仕様にしています。フィードバックや、Linuxのプロセス管理について学ぶためのさらなる知見があれば、ぜひ教えてください!
timeout[1] コマンドじゃダメなの?
[1] - https://www.man7.org/linux/man-pages/man1/timeout.1.html (https://www.man7.org/linux/man-pages/man1/timeout.1.html)