はじめに
Claude Codeは強力な対話型AIアシスタントですが、長時間かかるタスク(ディープリサーチ、大規模なコード分析など)を実行する際、完了まで待たなければならないという制約があります。
この記事では、Bashのバックグラウンド実行とClaude CodeのPrint Modeを組み合わせることで、真の非同期タスク実行を実現する方法を解説します。
Claude Codeの非同期実行の現状
何が非同期実行できるか?
Claude Codeには複数のツールがありますが、非同期実行をサポートしているのはBashツールのみです。
ツール | 非同期実行 | 備考 |
---|---|---|
Bash | ✅ 可能 | run_in_background=True |
Read | ❌ 不可 | 同期実行のみ |
Edit | ❌ 不可 | 同期実行のみ |
Grep | ❌ 不可 | 同期実行のみ |
Task (サブエージェント) | ❌ 不可 | 同期実行のみ(現状) |
WebFetch | ❌ 不可 | 同期実行のみ |
WebSearch | ❌ 不可 | 同期実行のみ |
Bashの非同期実行の仕組み
# 同期実行(デフォルト)
Bash(command="sleep 10 && echo 'done'")
# → 10秒間ブロック
# 非同期実行
Bash(
command="sleep 10 && echo 'done'",
run_in_background=True
)
# → すぐに制御が戻る(shell_id が返される)
# 後で結果を取得
BashOutput(bash_id="shell_id")
問題点:サブエージェントは非同期実行できない
# これはできない
Task(
subagent_type="general-purpose",
prompt="React 19をディープリサーチして",
run_in_background=True # ← このオプションは存在しない
)
ディープリサーチや複雑な分析タスクをサブエージェントに依頼すると、完了まで待つ必要があります。
解決策:Print Modeを使った非同期実行
発想の転換
「BashでClaude Code自体を実行すればいい」
Claude CodeにはPrint Mode(-p/--print
)という非対話的な実行モードがあります。これをBashのバックグラウンド実行と組み合わせることで、サブエージェントの疑似的な非同期実行が実現できます。
Print Modeとは?
# 対話モード(デフォルト)
claude
# → 対話セッション開始
# Print Mode(非対話モード)
claude -p "タスクを実行して"
# → 結果を標準出力に出力して終了
Print Modeの特徴:
- 非対話的(スクリプトから呼び出し可能)
- 結果を標準出力に出力
- パイプライン処理に適している
- 完了したら即座に終了
実装方法
基本パターン
ユーザーのリクエスト:
「claude -p "React 19の新機能をディープリサーチして、結果をreact19.mdに保存" > ./research.log 2>&1
というコマンドをバックグラウンドで実行して」
Claude Codeの動作:
Bash(
command='claude -p "React 19の新機能をディープリサーチして、結果をreact19.mdに保存" > ./research.log 2>&1',
run_in_background=True
)
応答:
調査を開始しました(shell ID: research_task)
その間に他の作業ができます
後で結果を確認:
「research_taskの結果を確認して、react19.mdの内容も見せて」
複数タスクの並行実行
ユーザーのリクエスト:
「以下の3つのコマンドをバックグラウンドで同時実行して:
1. claude -p "React 19を調査してreact.mdに保存" > ./react.log 2>&1
2. claude -p "Vue 3.5を調査してvue.mdに保存" > ./vue.log 2>&1
3. claude -p "Angular 18を調査してangular.mdに保存" > ./angular.log 2>&1
」
Claude Codeの応答:
3つの調査タスクをバックグラウンドで開始しました
- React調査: shell_id_1
- Vue調査: shell_id_2
- Angular調査: shell_id_3
並行実行中です。メインの会話は継続できます
実証実験
シンプルな例で動作確認
ユーザー(あなた)の操作:
「claude -p "現在の日時を教えて" --output-format text というコマンドを
バックグラウンドで実行して、shell IDを教えて」
Claude Codeの応答:
# Bashツールでバックグラウンド実行
Bash(
command='claude -p "現在の日時を教えて" --output-format text',
run_in_background=True
)
バックグラウンドで実行を開始しました
shell ID: a4d40f
約2分後、あなたが確認を依頼:
「shell ID a4d40f の結果を確認して」
Claude Codeが結果を取得:
BashOutput(bash_id="a4d40f")
結果:
Status: completed
Exit code: 0
Output: 現在の日時は **2025年10月15日(水) 09:35:53 PDT** (太平洋夏時間) です。
✅ 成功!バックグラウンドで別のClaude Codeプロセスが実行され、結果を取得できた
実用例
ケース1: 大規模なコードベースの分析
# 並行して複数のファイルを分析
for file in src/**/*.js; do
claude -p "このファイルの問題点を分析: $file" \
--output-format json > "analysis_$(basename $file).json" 2>&1 &
done
wait # すべて完了を待つ
# 結果を統合
claude -p "すべての分析結果を読んで総合レポートを作成"
ケース2: 複数技術の調査
#!/bin/bash
# parallel-research.sh
TOPICS=("react19" "vue3.5" "angular18" "svelte5" "solid2.0")
for topic in "${TOPICS[@]}"; do
claude -p "
${topic}の最新情報を調査して以下を実施:
1. 主な変更点を3つ抽出
2. ブレーキングチェンジを確認
3. 結果を${topic}-research.mdに保存
" > ./${topic}.log 2>&1 &
done
wait
echo "すべての調査が完了しました"
メリットとデメリット
メリット
メリット | 説明 |
---|---|
真の非同期実行 | メインの会話を妨げない |
Claude Codeの全機能が使える | WebSearch、推論、ファイル操作など |
並行実行可能 | 複数のタスクを同時実行 |
シンプルな実装 | 既存のBash非同期機構を活用 |
ターンをまたぐ | 会話の途中で結果を確認可能 |
デメリット
デメリット | 説明 | 対策 |
---|---|---|
トークン消費 | 複数プロセス分のトークンを消費 | 必要なタスクのみ並行実行 |
コンテキスト分離 | バックグラウンドのClaude Codeは会話履歴を見れない | プロンプトに必要情報を含める |
エラーハンドリング | 失敗しても気づきにくい | ログファイルを確認 |
実行時間 | Print Modeでも起動に時間がかかる | 長時間タスクのみ非同期化 |
セキュリティ | workspace trust dialogがスキップされる | 信頼できるディレクトリでのみ使用 |
ベストプラクティス
1. ログを必ず記録
# 標準出力と標準エラー出力を両方記録
claude -p "タスク" > output.log 2>&1
2. タイムアウトを設定
# timeoutコマンドで実行時間を制限
timeout 300 claude -p "タスク" > output.log 2>&1
3. 結果をファイルに保存
# Claude Codeに明示的にファイル保存を指示
claude -p "調査結果をresult.mdに保存してください" > /tmp/log 2>&1
4. 適切な粒度で分割
# 大きすぎるタスクは分割
# ❌ 悪い例
claude -p "すべてのフレームワークを調査"
# ✅ 良い例
claude -p "Reactを調査" &
claude -p "Vueを調査" &
claude -p "Angularを調査" &
5. エラーチェック
claude -p "タスク" > output.log 2>&1
exit_code=$?
if [ $exit_code -ne 0 ]; then
echo "Error: Task failed with exit code $exit_code"
cat output.log
fi
よくある質問
Q: Print Modeとヘッドレスモードの違いは?
A: 同じです。正式名称は「Print Mode」(-p/--print
)で、非対話的な実行モードを指します。
Q: 実行中のタスクを確認できますか?
A: はい、Claude Codeに「shell ID xxx の結果を確認して」と依頼すれば、定期的に確認できます。
Q: タスクをキャンセルできますか?
A: はい、Claude Codeに「shell ID xxx を終了して」と依頼すれば、シェルを終了できます。
Q: 複数のバックグラウンドタスクを同時実行できますか?
A: はい、制限はありません(リソースの限り)。
Q: 会話をまたいで結果を取得できますか?
A: はい、バックグラウンドシェルは会話をまたいで存続します。
まとめ
Claude Codeの非同期実行は、以下の組み合わせで実現できます:
Bashのバックグラウンド実行
+
Claude CodeのPrint Mode
=
サブエージェントの疑似的な非同期実行
この方法により:
- ディープリサーチを妨げない
- 複数タスクの並行実行が可能
- 長時間タスクをバックグラウンドで実行
- メインの会話は継続可能
従来は不可能だった真の非同期タスク実行が、既存の機能の組み合わせで実現できます。
参考リンク
この記事は実際のClaude Codeでの実験結果に基づいて作成されました。