CLAUDE LABEN
FORK — Claude Code 2.1.212で/forkの挙動が変わりました。会話を新しいバックグラウンドセッションへ複製し、作業を続けたまま並走できます。従来のセッション内サブエージェントは/subtaskに移りましたLIMITS — WebSearchの呼び出しがセッション単位で既定200回に制限されました。サブエージェントの起動も既定200回が上限で、暴走した検索・委譲のループを止められますMCPBG — 2分を超えるMCPツール呼び出しは自動的にバックグラウンドへ移り、セッションが固まらなくなりました。しきい値はCLAUDE_CODE_MCP_AUTO_BACKGROUND_MSで調整できますPLANFIX — プランモードがtouchやrmといったファイルを変更するBashコマンドを、許可プロンプトもcanUseToolコールバックも通さずに実行してしまう不具合が修正されましたSONNET5 — Claude Sonnet 5は導入価格として入力100万トークンあたり2ドル、出力10ドルで提供中です。8月31日を過ぎると3ドルと15ドルに戻りますIPO — Anthropicが早ければ10月の株式公開を視野に、引受銀行が投資家との面談を組み始めたと報じられていますFORK — Claude Code 2.1.212で/forkの挙動が変わりました。会話を新しいバックグラウンドセッションへ複製し、作業を続けたまま並走できます。従来のセッション内サブエージェントは/subtaskに移りましたLIMITS — WebSearchの呼び出しがセッション単位で既定200回に制限されました。サブエージェントの起動も既定200回が上限で、暴走した検索・委譲のループを止められますMCPBG — 2分を超えるMCPツール呼び出しは自動的にバックグラウンドへ移り、セッションが固まらなくなりました。しきい値はCLAUDE_CODE_MCP_AUTO_BACKGROUND_MSで調整できますPLANFIX — プランモードがtouchやrmといったファイルを変更するBashコマンドを、許可プロンプトもcanUseToolコールバックも通さずに実行してしまう不具合が修正されましたSONNET5 — Claude Sonnet 5は導入価格として入力100万トークンあたり2ドル、出力10ドルで提供中です。8月31日を過ぎると3ドルと15ドルに戻りますIPO — Anthropicが早ければ10月の株式公開を視野に、引受銀行が投資家との面談を組み始めたと報じられています
記事一覧/Claude Code
Claude Code/2026-05-13初級

Claude Code の Bash ツールで `npm run dev` や `docker run` が止まる — 長時間実行プロセスの正しい扱い方

Claude Code で npm run dev や docker run を実行すると Bash ツールがハングする問題の原因と解決策。バックグラウンド実行・タイムアウト設定・プロセス管理の実践的な手順を解説します。

claude-code129troubleshooting61bash4npm2dockerlong-running-processfix11

claude-code-long-running-process-hang-fix と検索してこのページに辿り着いた方は、おそらく Claude Code に「開発サーバーを起動して動作確認して」と頼んだら、画面がくるくる回ったまま何も返ってこなくなった経験をされているかと思います。

私自身、2014年から個人でアプリを開発してきて、Claude Code をワークフローに組み込み始めた当初にこの問題で何度か時間を溶かしました。npm run dev を Bash ツールで実行させた瞬間、セッションが完全にフリーズするあの感覚は、最初は何が起きているのかまったく分かりませんでした。

なぜ Claude Code の Bash ツールは長時間プロセスでフリーズするのか

Claude Code の Bash ツールは、コマンドの完了を待ってから結果を返す設計になっています。lsgit statusnpm install のような「実行して終わる」コマンドには問題ありません。

しかし npm run devdocker runpython -m http.server のようなフォアグラウンドで動き続けるプロセスを渡すと、Bash ツールはプロセスが終了するまでレスポンスを待ち続けます。開発サーバーは手動で止めない限り終了しませんから、事実上セッションは永遠に応答待ちになります。

これはバグではなく仕様です。「コマンドを実行して結果を受け取る」という設計原則に従った動作ですが、Web 開発では常駐プロセスを扱う場面が多いため、知らないとはまりやすい落とし穴になっています。

症状の確認 — どのコマンドでハングが起きるか

ハングが起きやすいコマンドのパターンです。

フロントエンド / Node.js 系:

  • npm run devyarn devpnpm dev
  • next devvitewebpack serve
  • npm start(Express サーバー等)

バックエンド・インフラ系:

  • docker rundocker compose up-d なし)
  • python manage.py runserver
  • rails serverphp artisan serve

ウォッチモード系:

  • jest --watchvitest watch
  • tsc --watch
  • nodemon server.js

逆に、一度実行して終わるコマンド(npm run builddocker buildjest --runInBand)はそのまま使えます。

解決策1 — バックグラウンド実行(& + リダイレクト)

最もシンプルな解決策は、コマンドをバックグラウンドで実行させることです。

# 開発サーバーをバックグラウンドで起動し、ログをファイルに保存
npm run dev > /tmp/dev-server.log 2>&1 &
echo "PID: $!"
 
# 数秒待ってからログを確認
sleep 3 && cat /tmp/dev-server.log

& をコマンド末尾に付けると、プロセスをバックグラウンドに送りつつ Bash ツールはすぐに PID を返して終了します。$! で直前に起動したプロセスの PID を取得しておくと、後で停止させるときに便利です。

Claude Code にこのパターンを伝えるプロンプトの例です。

開発サーバーを起動して、3000番ポートで動いているか確認してください。
サーバーはバックグラウンドで起動し、ログは /tmp/dev-server.log に保存してください。
起動確認は curl http://localhost:3000 で行ってください。

解決策2 — timeout コマンドで強制終了タイミングを指定する

「起動して特定のエラーが出ないか確認したい」という場面では、timeout コマンドが役立ちます。

# 10秒間だけ起動してログを取る
timeout 10 npm run dev > /tmp/dev-server.log 2>&1 || true
 
# ログを確認
grep -E "(error|Error|started|listening|ready)" /tmp/dev-server.log

timeout 10 を付けると、10秒後にプロセスが自動停止します。起動直後のエラーチェックや、ポート待ち受けの確認程度なら十分です。

解決策3 — curlwait-on で起動完了を確認する

開発サーバーを起動してから「ページが表示されるか確認して」という用途には、次のパターンが実用的です。

# バックグラウンドで起動
npm run dev > /tmp/dev-server.log 2>&1 &
DEV_PID=$!
 
# ポートが開くまで最大30秒待つ
for i in $(seq 1 30); do
  if curl -s http://localhost:3000 > /dev/null 2>&1; then
    echo "✅ 起動確認: http://localhost:3000 で応答あり"
    break
  fi
  sleep 1
done
 
# サーバーを停止
kill $DEV_PID 2>/dev/null

npx wait-on を使うとより簡潔になります。

npm run dev > /tmp/dev-server.log 2>&1 &
DEV_PID=$!
npx wait-on http://localhost:3000 --timeout 30000 && echo "✅ Server ready"
kill $DEV_PID 2>/dev/null

解決策4 — Docker は必ず -d フラグを付ける

Docker コンテナの起動は -d(デタッチ)フラグが必須です。

# ❌ これは止まる
docker run -p 3000:3000 myapp
 
# ✅ これは動く
docker run -d -p 3000:3000 --name myapp myapp
docker logs myapp

docker compose up の場合も同様です。

# ✅ バックグラウンド起動
docker compose up -d
 
# コンテナの状態確認
docker compose ps
docker compose logs --tail=20

Claude Code への指示例です。

docker compose up -d で起動して、すべてのサービスが healthy になっているか確認してください。
確認後に docker compose ps の結果を教えてください。

CLAUDE.md にプロセス管理の規則を書いておく

このパターンを毎回プロンプトで説明するのは手間なので、プロジェクトの CLAUDE.md に一度書いておくと楽です。

## プロセス管理ルール
 
- 開発サーバーの起動は必ずバックグラウンド実行すること
  - 例: `npm run dev > /tmp/dev.log 2>&1 &`
- docker compose は必ず `-d` フラグを付ける
- 起動確認は curl または wait-on で行う
- プロセスの停止は `kill <PID>` または `docker compose down`
- テストはウォッチモードではなく `--runInBand` または通常実行を使う

Claude Code の CLAUDE.md 設定ガイドでも、このような実行環境の制約をプロジェクトに記述する方法を解説しています。

フリーズしてしまったセッションの回復方法

すでにセッションがフリーズした状態の場合は、以下の手順で回復できます。

1. Claude Code の停止ボタンを押す(ターミナルの場合は Ctrl+C

進行中のリクエストを中断します。

2. 残ったプロセスを手動で停止する

# ポート3000を使っているプロセスを確認
lsof -ti:3000 | xargs kill 2>/dev/null
 
# または名前で探す
pkill -f "npm run dev"
pkill -f "vite"

3. ポートが解放されたか確認する

lsof -i:3000
# 何も表示されなければポートは空き

ウォッチモードのテストが止まる問題

jest --watchvitest watch も同様にハングします。CI 相当の動作をさせる場合は、ウォッチフラグを外してください。

# ❌ ウォッチモードは止まる
jest --watch
 
# ✅ 一回実行して終了
jest --runInBand
npx vitest run
 
# カバレッジ付き
jest --coverage

「テストが全部通るか確認して」と Claude Code に頼む際は、ウォッチモードを使わない旨を明示すると確実です。

よくある間違いパターン

実際の開発で遭遇しやすい、プロンプトの書き方とその改善例です。

❌ フリーズするプロンプト例:

開発サーバーを起動して、ページが崩れていないか確認してください

Claude Code がそのまま npm run dev を実行してフリーズします。

✅ フリーズしないプロンプト例:

開発サーバーをバックグラウンドで起動(npm run dev > /tmp/dev.log 2>&1 &)して、
起動後に curl http://localhost:3000 でレスポンスを確認してください。
確認が終わったらサーバーを停止してください。

明示的にバックグラウンド実行の指示を入れることで、Claude Code は適切なコマンド設計をしてくれます。

この問題で詰まっている方の参考になれば幸いです。Claude Code の Bash ツールは「コマンドを実行して終わる」設計だということを意識しておくと、他のハング問題(python input() を含むスクリプト、対話型 CLI ツール等)にも同じ考え方で対処できます。

関連するトラブルシューティングとして、Claude Code の Bash ツール実行エラー全般の解決ガイドも参考になります。

シェア

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

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

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

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

関連記事

Claude Code2026-04-08
Claude Code の Bash ツール実行エラーを解決する — タイムアウト・Permission Denied・出力切れの原因と対処法
Claude Code の Bash ツールでコマンドが失敗する原因と解決方法を徹底解説。タイムアウト、Permission Denied、出力が途切れるなどのエラーをステップバイステップで対処します。
Claude Code2026-06-10
git add -A が .bak バックアップまで巻き込む — in-place 修正スクリプトと自動コミットの落とし穴
sed -i や自作の --fix スクリプトが残す .bak バックアップを git add -A が無言で取り込み、本番リポジトリに混入させてしまう問題。なぜ気づきにくいのか、scoped add と .gitignore でどう塞ぐかを実例で整理します。
Claude Code2026-06-09
前回の記事本文が別の記事に紛れ込む — 固定名の一時ファイルに残る残骸の罠
Claude Code の自動化で、固定名の一時ファイルに前回の中身が残り、まったく別の記事に古い本文が混入する。書き込みが無音で失敗する仕組みと、ユニーク名+挿入後の grep 照合で防ぐ方法を記録します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →