◉ANTIGRAVITY LABEN
記事一覧/AIツール
⚙ AIツール/2026-10-18中級

ターミナルが Running のまま終わらない。待ち時間を延ばす前に確かめた、終わりの合図が届かない3つの形

エージェントに任せたコマンドが Running のまま終わらないとき、遅いのではなく終わりの合図が届いていないことがあります。標準入力の待ち、子プロセスが出力の口を握り続ける形、確認待ちの3つを手元のシェルで測り、3.0 秒で打ち切れた場合と 30.0 秒待たされた場合の差、効かない場面まで書き残します。

ターミナル4トラブルシューティング36標準入力タイムアウト5個人開発110Antigravity388

画像を一括で整えるコマンドをエージェントに任せて、席を離れたときのことです。戻ってくると、ターミナル欄は Running のまま動いておらず、出力も増えていませんでした。

遅いだけなのだろうと思い、そのまま 10 分ほど待ちました。それでも終わらないので、次はエージェントに伝える待ち時間の上限を倍にしました。結果は芳しくありませんでした。待つ時間が長くなっただけで、コマンドは最後まで終わらなかったのです。

あとから振り返ると、私は「遅い」と「終わりの合図が届いていない」を同じものとして扱っておりました。ここでは、後者が起きる形を 3 つに分け、手元のシェルで測った数字とあわせて書き残します。

最初にお伝えしたいのは、疑う対象です

Running のまま動かないとき、疑うのは処理の重さではなく、コマンドが「もう終わりました」と言える道が塞がれていないかのほうです。塞がれる形は、私の場合ほぼ次の 3 つに収まりました。

形何が起きているか見分けるきっかけ
標準入力の待ち入力の終わり(EOF)が来ず、読み続けている引数なしの cat や、ファイル指定のない読み込み処理
子プロセスの居残り親は終わったが、裏に残った子が出力の口を持っている末尾の &、開発サーバーや監視の起動
確認・編集画面の待ち人が答える前提の画面で止まっている-m なしの git commit、-y のない導入コマンド

なお、これから書く数字は、Antigravity のターミナルそのものではなく、手元の Linux シェル(Python 3.13、git 2.43)で測ったものです。エージェントのターミナルが同じ条件で同じ挙動になるとは限りませんので、その点はご自身の環境で確かめていただければ幸いです。

形1: 標準入力の待ち

入力を受け取るコマンドは、入力が閉じられるまで終わりません。開いたままの入力を与えて 3 秒で打ち切ってみました。

# 入力が開いたまま(EOF が来ない)状態を作る
timeout 3 sh -c 'cat' < <(sleep 100)
echo "exit=$?"      # → 124(3.0 秒で打ち切られた=自力では終わらなかった)
 
# 入力を最初から閉じておく
timeout 3 sh -c 'cat' < /dev/null
echo "exit=$?"      # → 0(0.007 秒で終了)

cat だけでなく、python3 -c 'import sys; print(len(sys.stdin.read()))' でも同じで、開いた入力では 3.0 秒で打ち切られ、/dev/null を渡すと即座に 0 を返して終わりました。

なぜこう書くのかと言えば、< /dev/null は「この先に入力は来ません」とコマンドに先に伝える一行だからです。読む側は EOF を受け取って、自分から終わってくれます。

形2: 子プロセスの居残り

私が最初にはまったのは、こちらでした。親のシェルは終わっているのに、出力を受け取る側がいつまでも待たされる形です。

# 裏に sleep を残したまま、出力を cat で受ける
timeout 40 sh -c 'sleep 30 & echo started' | cat
# → "started" は一瞬で出るのに、コマンド全体は 30.0 秒後にようやく戻る
 
# 子の出力と入力を切り離しておく
timeout 40 sh -c 'sleep 30 >/dev/null 2>&1 </dev/null & echo started' | cat
# → 0.004 秒で戻る

同じ & を付けたコマンドでも、前者は 30.0 秒、後者は 0.004 秒でした。差を生んでいるのは、裏に残った子が親と同じ出力の口を持ち続けているかどうかだけです。開発サーバーを立ち上げて「起動したら次へ」とエージェントに頼むと、まさにこの形になります。

起動するだけのコマンドは、出力を必ずファイルへ逃がしておきます。

# サーバーを裏で起動して、ターミナルは先へ進める
nohup npm run dev > dev.log 2>&1 < /dev/null &
echo "pid=$!"

形3: 確認や編集画面の待ち

三つ目は、人が答える前提の画面で止まる形です。-m を付けずに git commit を呼ぶと、エディタが開いて入力を待ちます。エディタを開かせないよう GIT_EDITOR=true を指定して試すと、待たずに Aborting commit due to empty commit message. を出して終了コード 1 で戻りました。固まる代わりに、失敗として見えるようになったわけです。

つまり、ここでの対策は止まった画面を待つことではなく、そもそも画面が出ない書き方に変えることです。

  • コミットには必ず -m を付けます。
  • 導入系のコマンドには -y や --yes を付けます。
  • 対話を避けられない場合は、その作業をエージェントに頼まず、自分の手で実行します。

どの形かを見分ける

3つのどれなのかは、止まっているあいだに別のターミナルから覗くと分かります。Linux では次のとおりです(macOS では lsof -p <PID> で近いことができます)。

# 止まっているコマンドの PID を調べて、状態と入力の先を見る
ps -o pid,stat,wchan:14,cmd -p <PID>
ls -l /proc/<PID>/fd/0

先ほどの cat で試すと、wchan が anon_pipe_read、標準入力が pipe:[2107] と表示されました。入力のパイプを読み続けている、という意味です。/dev/null を渡した場合は、確認する前に終わってしまいます。

子プロセスの居残りは、ps -o pid,ppid,stat,cmd -C sleep のように残った子を探すと、親が 1 に付け替わった sleep 30 が見つかりました。親はもういないのに子だけが生きている、という形を目で確かめられます。

効かない場面と、線引き

ここまでの対策には、効かない場面があります。

< /dev/null は、入力を渡すのが目的のコマンドを壊します。psql < query.sql や docker run -i のように、入力を受け取ってこそ意味のあるものには付けられません。また、timeout で打ち切った場合の終了コード 124 は「失敗」ではなく「時間切れ」で、処理が途中まで進んでいたのかどうかは分かりません。打ち切りは原因の切り分けであって、解決ではないのです。

いま思えば、最初に待ち時間を倍にしたのは、原因を見る手間を避けたかったからなのかもしれません。いまは次の順番にしています。待ち時間を延ばす前に、終わりの合図が届く道を作ります。 延ばしてよいのは、道を作ったあとに本当に遅いと分かったときだけです。

エージェントへの指示文には、次の 3 行を入れておきます。

- 入力を読むコマンドには < /dev/null を付け、60 秒で timeout をかけること
- 裏で動かすものは nohup と出力のファイル化で切り離すこと
- git commit には -m、導入系には -y を付け、対話の画面を出さないこと

次の一歩

いま Running のまま止まっているコマンドがあれば、まず timeout 20 <同じコマンド> < /dev/null で動かしてみてください。20 秒で戻れば入力待ち、戻らなければ子プロセスか確認待ちを疑う順番になります。許可ダイアログのほうで作業が止まる場合は Antigravity の許可ダイアログが何度も表示される・「常に許可」が効かないときの診断と解決ガイド を、時間切れと成功を取り違えないための確認は Antigravity CLI 1.1.28 で print-timeout 超過が成功終了になりました — 無人実行の判定を見直す をご覧ください。

この確認だけは、急いでいる日でも省かないようにしています。

シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

⚙ AIツール2026-08-14
速いはずのモデルが遅いとき、疑うのはモデルではなく推論強度です
Antigravity でモデルごとに選べるようになった推論強度(Low / Medium / High)を、作業の性質からどう決めるかをまとめました。段階を変えても速くならないときに疑う箇所と、自分の判断を記録で直す方法も添えています。
⚙ AIツール2026-07-05
AI Ultra 100ドル枠は個人開発に見合うか — 上限の壁と並列度で損益分岐を測る
月100ドルの AI Ultra 枠(Pro の5倍上限)が個人開発者に見合うかを、上限に当たる頻度と並列エージェントの実効スループットから損益分岐として試算する方法を、計算スクリプトつきで整理します。
⬡ 連携・プラグイン2026-08-03
サーバーごとに秒数を書く前に測ったこと — MCP の接続と呼び出しは 486 倍違っていました
2.4.3 で MCP サーバーごとにタイムアウトの秒数を指定できるようになりました。何秒が妥当かを決めるために stdio サーバーを自作して境界別に実測し、単一の値では覆えない理由と、いま設定に書いている値の決め方をまとめます。