sandbox_procs
sandbox_exec の background: true で始めたコマンドを一覧し、終了を待ち、止めます。フォアグラウンドのコマンドも execId で取得したり待ったりできます。pkill -f や pgrep -f の代わりに使います。それらのパターンは、コマンドラインにそれを含むすべてのプロセスに一致し、ほかのジョブも含まれるからです。
| 入力 | 出力 |
|---|---|
id、action(既定の list、wait、stop)、bgId(バックグラウンドの bgId またはフォアグラウンドの execId。wait と stop では必須。list ではそのコマンドだけ)、all(list のみ)、tailBytes(1〜16384)、timeoutSec(wait のみ。既定 600、最大 600)、until(wait のみ。既定の exit または ready)、readyPort と readyLog(wait のみ) |
list:procs[{bgId, running, note, cmd, startedAt, logPath, mine, cpu, exitCode, signal, endReason, finishedAt, readyWhen, ready, readyAt, logTail}] と foreground[…]、終わったものを省いたときは finished と hint。コマンド 1 つ(bgId)には steps も、終わったフォアグラウンドのコマンドには result も付く。wait:proc と stillRunning(準備完了を待つときは ready も)。stop:proc と stopped |
sandbox_exec の background: true で始めたコマンドにはそれぞれ bgId があり、出力は logPath、つまり /work/.sbx/logs/<bgId>.log に書かれます。sandbox_procs はそれらのコマンドを扱います。
sandbox_procs { "id": "<id>" }
sandbox_procs { "id": "<id>", "action": "list", "bgId": "<bgId>" }
sandbox_procs { "id": "<id>", "action": "wait", "bgId": "<bgId>", "timeoutSec": 300 }
sandbox_procs { "id": "<id>", "action": "stop", "bgId": "<bgId>" }
list(actionなしの呼び出しも同じ)は{ "procs": [...] }を返します。動作中のバックグラウンドコマンドを古い順に並べ、それぞれにbgId、running、note(sandbox_execに渡したもの)、cmd(先頭 120 文字。シークレットの値は隠されます)、startedAt、logPath、cpu(そのすべてのプロセスの %CPU の合計。100 で 1 コア)、mine(この会話が始めたものかどうか)が付きます。foregroundは、ボックスを使っているすべての会話の、いま動作中のフォアグラウンドのコマンドを同じ形で、execIdをbgIdとして並べます。複数の会話で共有しているボックスでは、cpuとmineで誰の作業がマシンを使っているかがわかります。終わったものを省いたときは、finishedにその数、hintに見る方法が出ます。all: trueなら終わったものもexitCode付きで並びます(動作中のものには付きません)。bgIdを指定すると、動作中かどうかにかかわらずそのコマンドだけを、ログの末尾であるlogTail付きで返します。- 普通の
listにはlogTailが付きません。bgId付きのlist、wait、stopはログの最後の 4096 バイトを返し、tailBytes(1〜16384)でその量を変えられます(普通のlistにも効きます)。中のシークレットの値は****になります(sandbox_exec)。ログファイル自体は変わりません。 waitはそのコマンドが終わるか、timeoutSec(既定 600、最大 600)が尽きるまで待ち、{ "proc": {...}, "stillRunning": false }を返します。procにはexitCodeが付きます。先に時間が尽きたときはエラーではなくstillRunning: trueを返すので、もう一度呼びます。バックグラウンドで始めた長いビルドやテストはこれで待ちます。sandbox_execでsleepしながらポーリングする必要はありません。until: "ready"を付けると、代わりにコマンドの準備ができた時点で戻ります。そのreadyPortが接続を受け付けるか、ログの行がreadyLogに一致したとき(どちらもsandbox_execに渡したもの)で、ready: trueとreadyAtが付きます。waitにreadyPortやreadyLogを渡すと、条件なしで始めたコマンドにその条件を設定(または置き換え)し、until: "ready"も指定したことになります。ログは先頭から探すので、呼び出し前に出力された行も数えます。準備ができる前にコマンドが終わると、waitはそれを終わったものとしてready: false付きで返します。- フォアグラウンドのコマンドの
execIdはbgIdとして使えます。動作中は、それを指定したlistとwaitがforeground: true付きで示し、そこまでの出力をlogTailとして返します。終わると、proc.resultにそのsandbox_execが返したもの(stdout、stderr、exitCode、truncated、durationMs、timedOut、出力が切り詰められたときはoutputPath)が入ります。その呼び出しが途中で切れたときに使ってください。直近 200 件のフォアグラウンドの結果が保存されます。 steps(コマンド 1 つのときだけ)は、その中でpsbx-stepが記録したものを並べます。各ステップのname、exitCode、ms、startedAtで、まだ動いているものにはrunning: trueが付きます(sandbox_execを参照)。- シグナルで終わったコマンドには
signalがあり、何がそれを送ったかをendReasonが示します:stopped by sandbox_procs stop、OOM killer(ボックスのメモリが足りなくなった)、またはほかのプロセスです。 stopはコマンドのプロセスグループ全体を終わらせます。SIGTERMを送り、5 秒後にまだ残っていればSIGKILLを送ります。コマンドが起動したものも一緒に終わるので、npxやnpm runで起動したサーバーも止まり、ポートが空きます。{ "proc": {...}, "stopped": true }を返し、止めたコマンドのexitCodeは -1 です。すでに終わっていたコマンドには、そのときの状態をそのまま返します。- バックグラウンドコマンドはこれで止め、
sandbox_execのpkill -fやpgrep -fは使わないでください。コマンドはスクリプトファイルから動くので、パターンが自分のsandbox_execを動かしているシェルに一致することはもうありませんが、コマンドラインにそれを含むほかのプロセスにはすべて一致し、ほかのバックグラウンドジョブも含まれます。バックグラウンドで起動していないプロセスには、プロセス名に完全一致するpkill -x <名前>を使ってください。kill <pid>はそのプロセス 1 つにしかシグナルを送らず、それが起動したプロセス(npxの下のサーバーなど)は動き続けることがあります。stopはグループ全体を終わらせます。 - バックグラウンドコマンドは
/work/.sbx/procsに記録されるので、ボックスのエージェントである boxd の再起動(更新、クラッシュ、メモリ不足での強制終了)をまたいで残ります。動作中のものはこれまでどおり一覧でき、止められます。boxd が止まっている間に終わったものはexitCodeが -1 で、本当の終了コードはわからないと示すendReasonが付きます。これより古いイメージから起動したボックスは、boxd が再起動するとこの記録を失い、bgId not foundと答えます。 - エラー:ボックスが知らない
bgIdには、考えられる理由付きでbox <id>: bgId not found: …、bgIdのないwaitやstopにはbgId is required: list them first with action list、それ以外のactionにはaction must be list, stop or waitが返ります。 - 呼び出しはほかのツールと同じくボックスの使用に数えるので、長いジョブを
waitで待っている間、ボックスがアイドルで凍結されることはありません。凍結したボックスには先に起こします(ボックスの状態)。バックグラウンドコマンドは凍結と解凍をまたいで動き続け、ボックスを起こしておくのは最後の使用から最大 1 時間です。フォアグラウンドのsandbox_execの中で&で起動したプロセスはこれに含まれません。このツールでは一覧も停止もできず、起動した呼び出しがleftoverChildren: trueで知らせます(sandbox_exec)。
すべてのツールとトピックはツールリファレンスに並んでいます。