0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Codeで非同期タスクを実現する方法

Last updated at Posted at 2025-10-16

はじめに

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での実験結果に基づいて作成されました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?