OpenClawのプロセス管理を最適化:安定した実行環境の構築
バックグラウンドで実行したプロセスがいつの間にか「ゾンビ」になっていたり、タイムアウトしたはずなのにリソースを食いつぶしていたりすること、ありますよね。プロセスのライフサイクル管理は、一見シンプルに見えて実は非常に奥が深く、油断するとすぐに制御不能になってしまいます。
今回は、PTY(仮想端末)とプロセスの監視(Supervision)をより安全で予測可能なものにするための設計と実装についてお伝えします。場当たり的なプロセスの一致確認ではなく、確実な所有権とクリーンアップを実現するための改善案です。
1. 課題と目標
Section titled “1. 課題と目標”私たちは、以下のような多岐にわたる長時間実行コマンドに対して、信頼できる単一のライフサイクルを必要としています。
execによるフォアグラウンド実行execによるバックグラウンド実行processのフォローアップアクション(poll,log,send-keys,paste,submit,kill,remove)- CLI agent ランナーのサブプロセス
目標は単に PTY をサポートすることではありません。不安定なプロセスマッチングのヒューリスティックを排除し、予測可能な所有権、キャンセル、タイムアウト、そしてクリーンアップを実現することです。
2. スコープと境界線
Section titled “2. スコープと境界線”- 実装は
src/process/supervisor内に留め、内部的なものとします。 - このために新しいパッケージを作成しないでください。
- 実用的な範囲で、現在の挙動との互換性を維持します。
- ターミナルのリプレイや tmux スタイルのセッション永続化までスコープを広げないでください。
3. このブランチで実装された内容
Section titled “3. このブランチで実装された内容”すでに存在する Supervisor のベースライン
Section titled “すでに存在する Supervisor のベースライン”- Supervisor モジュールは
src/process/supervisor/*に配置されています。 - Exec ランタイムと CLI ランナーは、すでに Supervisor の spawn と wait を経由するようにルーティングされています。
- Registry のファイナライゼーションは冪等(Idempotent)です。
今回完了した内容
Section titled “今回完了した内容”- 明示的な PTY コマンドのコントラクト
SpawnInputがsrc/process/supervisor/types.tsでタグ付き共用体(Discriminated Union)になりました。- PTY の実行には、汎用的な
argvを再利用するのではなく、ptyCommandが必須となります。 - Supervisor は
src/process/supervisor/supervisor.ts内でargvを join して PTY コマンド文字列を再構築しなくなりました。 - Exec ランタイムは
src/agents/bash-tools.exec-runtime.tsでptyCommandを直接渡すようになっています。
- プロセスレイヤーの型結合の解除
- Supervisor の型が agent から
SessionStdinをインポートしなくなりました。 - プロセスローカルの stdin コントラクトは
src/process/supervisor/types.ts(ManagedRunStdin) に定義されています。 - 各 Adapter はプロセスレベルの型にのみ依存するようになりました:
src/process/supervisor/adapters/child.tssrc/process/supervisor/adapters/pty.ts
- プロセスツールのライフサイクル所有権の改善
src/agents/bash-tools.process.tsは、まず Supervisor を通じてキャンセルをリクエストするようになりました。process kill/removeは、Supervisor で見つからない場合に process-tree によるフォールバック停止を使用します。removeは、停止リクエストの直後に実行中のセッションエントリを削除することで、決定論的な削除挙動を維持します。
- Watchdog デフォルト設定の一元化
src/agents/cli-watchdog-defaults.tsに共有のデフォルト設定を追加しました。src/agents/cli-backends.tsがこの共有デフォルトを使用します。src/agents/cli-runner/reliability.tsも同じ共有デフォルトを使用します。
- 不要なヘルパーのクリーンアップ
src/agents/bash-tools.shared.tsから、使用されていないkillSessionヘルパーパスを削除しました。
- Supervisor パスの直接テストの追加
- Supervisor のキャンセルを経由した kill と remove のルーティングをカバーするため、
src/agents/bash-tools.process.supervisor.test.tsを追加しました。
- 信頼性のギャップの修正完了
src/agents/bash-tools.process.tsは、Supervisor でのルックアップに失敗した際、実際の OS レベルのプロセス停止にフォールバックするようになりました。src/process/supervisor/adapters/child.tsは、デフォルトのキャンセル/タイムアウト時の kill パスに process-tree 停止セマンティクスを使用するようになりました。src/process/kill-tree.tsに共有の process-tree ユーティリティを追加しました。
- PTY コントラクトの境界ケースのカバー
ptyCommandのそのままの転送と、空コマンドの拒否を確認するため、src/process/supervisor/supervisor.pty-command.test.tsを追加しました。- child adapter のキャンセルにおける process-tree kill 挙動を確認するため、
src/process/supervisor/adapters/child.test.tsを追加しました。
4. 残っている課題と決定事項
Section titled “4. 残っている課題と決定事項”信頼性のステータス
Section titled “信頼性のステータス”今回のパスで必要だった 2 つの信頼性に関するギャップは解消されました:
process kill/removeは、Supervisor で見つからない場合に実際の OS レベルの停止フォールバックを持つようになりました。- child のキャンセル/タイムアウトは、デフォルトの kill パスで process-tree kill セマンティクスを使用します。
- 両方の挙動に対してリグレッションテストが追加されました。
耐久性と起動時の整合性
Section titled “耐久性と起動時の整合性”再起動時の挙動は、明示的に「メモリ内のライフサイクルのみ」と定義されています。
reconcileOrphans()は、設計通りsrc/process/supervisor/supervisor.tsで no-op(何もしない)のままです。- プロセスの再起動後、アクティブな実行状態は復元されません。
- これは、不完全な永続化によるリスクを避けるため、今回の実装パスにおける意図的な境界線です。
メンテナンスのためのフォローアップ
Section titled “メンテナンスのためのフォローアップ”src/agents/bash-tools.exec-runtime.tsのrunExecProcessは依然として多くの責任を抱えています。今後のフォローアップで、役割を絞ったヘルパーに分割することをお勧めします。
5. 実装プラン
Section titled “5. 実装プラン”必要な信頼性とコントラクト項目に関する実装パスは完了しました。
完了済み:
process kill/removeの実際の停止へのフォールバック- child adapter のデフォルト kill パスにおける process-tree キャンセル
- フォールバック kill と child adapter の kill パスのリグレッションテスト
- 明示的な
ptyCommand下での PTY コマンド境界ケーステスト reconcileOrphans()を設計通り no-op とした、明示的なメモリ内再起動境界の確立
オプションのフォローアップ:
- 挙動を変えずに
runExecProcessを役割ごとのヘルパーに分割
6. ファイル構成
Section titled “6. ファイル構成”Process supervisor
Section titled “Process supervisor”src/process/supervisor/types.ts: タグ付きの spawn input とプロセスローカルの stdin コントラクトで更新。src/process/supervisor/supervisor.ts: 明示的なptyCommandを使用するように更新。src/process/supervisor/adapters/child.tsおよびsrc/process/supervisor/adapters/pty.ts: agent の型から切り離されました。src/process/supervisor/registry.ts: 冪等な finalize は変更なく維持。
Exec と process の統合
Section titled “Exec と process の統合”src/agents/bash-tools.exec-runtime.ts: PTY コマンドを明示的に渡し、フォールバックパスを維持するように更新。src/agents/bash-tools.process.ts: Supervisor 経由でキャンセルし、実際の process-tree 停止にフォールバックするように更新。src/agents/bash-tools.shared.ts: 直接的な kill ヘルパーパスを削除。
CLI の信頼性
Section titled “CLI の信頼性”src/agents/cli-watchdog-defaults.ts: 共有ベースラインとして追加。src/agents/cli-backends.tsおよびsrc/agents/cli-runner/reliability.ts: 同じデフォルト設定を使用するように変更。
7. 今回のバリデーション実行
Section titled “7. 今回のバリデーション実行”ユニットテスト:
pnpm vitest src/process/supervisor/registry.test.tspnpm vitest src/process/supervisor/supervisor.test.tspnpm vitest src/process/supervisor/supervisor.pty-command.test.tspnpm vitest src/process/supervisor/adapters/child.test.tspnpm vitest src/agents/cli-backends.test.tspnpm vitest src/agents/bash-tools.exec.pty-cleanup.test.tspnpm vitest src/agents/bash-tools.process.poll-timeout.test.tspnpm vitest src/agents/bash-tools.process.supervisor.test.tspnpm vitest src/process/exec.test.tsE2E ターゲット:
pnpm vitest src/agents/cli-runner.test.tspnpm vitest run src/agents/bash-tools.exec.pty-fallback.test.ts src/agents/bash-tools.exec.background-abort.test.ts src/agents/bash-tools.process.send-keys.test.ts型チェックに関する注意:
- このリポジトリでは
pnpm build(およびフル lint/docs ゲート用のpnpm check)を使用してください。pnpm tsgoに言及している古いノートは廃止されています。
8. 維持される運用上の保証
Section titled “8. 維持される運用上の保証”- Exec 環境のハードニング(要塞化)挙動は変更されません。
- 承認および許可リスト(allowlist)のフローは変更されません。
- 出力のサニタイズおよび出力制限は変更されません。
- PTY adapter は、強制終了時やリスナー破棄時の wait settlement を引き続き保証します。
9. 完了の定義
Section titled “9. 完了の定義”- Supervisor が管理対象の実行におけるライフサイクル所有者であること。
- PTY の spawn が、argv の再構築を行わない明示的なコマンドコントラクトを使用していること。
- プロセスレイヤーが、Supervisor の stdin コントラクトにおいて agent レイヤーへの型の依存を持っていないこと。
- Watchdog のデフォルト設定が一元化されていること。
- 対象となるユニットテストおよび E2E テストがすべてパスすること。
- 再起動時の耐久性の境界が、明示的にドキュメント化されているか、完全に実装されていること。
10. まとめ
Section titled “10. まとめ”このブランチにより、より一貫性があり安全な監視体制が整いました:
- 明示的な PTY コマンドコントラクトの導入
- プロセスレイヤーのクリーンな階層化
- プロセス操作における Supervisor 主導のキャンセルパス
- Supervisor で見つからない場合の実際のフォールバック停止処理
- child 実行のデフォルト kill パスにおける process-tree キャンセル
- Watchdog デフォルト設定の統合
- 明示的なメモリ内再起動境界(今回のパスでは再起動をまたぐ孤立プロセスの調整は行わない)
次のステップ
Section titled “次のステップ”困ったときは AI Setup Assistant に聞いてみてくださいね!
OpenClaw Expert
まだ解決しませんか?
このページで解決しない場合は、OpenClaw Expertに直接質問してください。