バックグラウンドExec + プロセスツール

OpenClawはexecツールを通じてシェルコマンドを実行し、長時間実行タスクをメモリ上で保持します。processツールでこれらのバックグラウンドセッションを管理できます。

execツール

主要パラメータ:

  • command(必須)
  • yieldMs(デフォルト10000):この遅延後に自動的にバックグラウンドへ移行
  • background(bool):即座にバックグラウンドで実行
  • timeout(秒、デフォルト1800):このタイムアウト後にプロセスを終了
  • elevated(bool):elevatedモードが有効/許可されている場合、ホスト上で実行
  • 実際のTTYが必要な場合はpty: trueを設定
  • workdirenv

動作:

  • フォアグラウンド実行は出力を直接返します。
  • バックグラウンド化された場合(明示的またはタイムアウトにより)、ツールはstatus: "running" + sessionIdと末尾の短い出力を返します。
  • 出力はセッションがポーリングまたはクリアされるまでメモリに保持されます。
  • processツールが無効化されている場合、execは同期的に実行され、yieldMs/backgroundは無視されます。
  • 生成されたexecコマンドは、コンテキストに応じたシェル/プロファイルルール用にOPENCLAW_SHELL=execを受け取ります。

子プロセスブリッジ

exec/processツール外で長時間実行する子プロセスを起動する場合(例:CLIの再起動やゲートウェイヘルパー)、子プロセスブリッジヘルパーをアタッチして、終了シグナルの転送とexit/error時のリスナー解除を行います。これにより、systemdでの孤立プロセスを防ぎ、プラットフォーム間で一貫したシャットダウン動作を維持できます。

環境変数オーバーライド:

  • PI_BASH_YIELD_MS:デフォルトのyield(ms)
  • PI_BASH_MAX_OUTPUT_CHARS:メモリ上の出力上限(文字数)
  • OPENCLAW_BASH_PENDING_MAX_OUTPUT_CHARS:ストリームごとの保留中stdout/stderr上限(文字数)
  • PI_BASH_JOB_TTL_MS:完了セッションのTTL(ms、1分〜3時間の範囲)

設定(推奨):

  • tools.exec.backgroundMs(デフォルト10000)
  • tools.exec.timeoutSec(デフォルト1800)
  • tools.exec.cleanupMs(デフォルト1800000)
  • tools.exec.notifyOnExit(デフォルトtrue):バックグラウンドexecが終了した際にシステムイベントをキューに入れ、ハートビートを要求
  • tools.exec.notifyOnExitEmptySuccess(デフォルトfalse):trueの場合、出力なしで正常終了したバックグラウンド実行にも完了イベントをキューに入れる

processツール

アクション:

  • list:実行中+完了済みセッション
  • poll:セッションの新しい出力を取得(終了ステータスも報告)
  • log:集約された出力を読み取り(offset + limit対応)
  • write:stdinを送信(data、オプションのeof
  • kill:バックグラウンドセッションを終了
  • clear:完了済みセッションをメモリから削除
  • remove:実行中ならkill、完了済みならclear

注意事項:

  • バックグラウンド化されたセッションのみがリスト/メモリに保持されます。
  • セッションはプロセス再起動時に失われます(ディスク永続化なし)。
  • セッションログはprocess poll/logを実行してツール結果が記録された場合にのみチャット履歴に保存されます。
  • processはエージェント単位でスコープされ、そのエージェントが開始したセッションのみが表示されます。
  • process listにはクイックスキャン用の導出されたname(コマンド動詞+対象)が含まれます。
  • process logは行ベースのoffset/limitを使用します。
  • offsetlimitの両方が省略された場合、末尾200行を返し、ページングヒントを含みます。
  • offsetが指定されlimitが省略された場合、offsetから末尾まで返します(200行の制限なし)。

使用例

長時間タスクを実行し、後でポーリング:

{ "tool": "exec", "command": "sleep 5 && echo done", "yieldMs": 1000 }
{ "tool": "process", "action": "poll", "sessionId": "<id>" }

即座にバックグラウンドで開始:

{ "tool": "exec", "command": "npm run build", "background": true }

stdinを送信:

{ "tool": "process", "action": "write", "sessionId": "<id>", "data": "y\n" }