アルアカ - Arcadia Academia

Arcadia Academiaは「エンジニアリングを楽しむ」を合言葉に日本のデジタル競争力を高めることをミッションとするテックコミュニティです。

Claude Codeを並行セッションで安定運用する — tmux起動・git worktree分離・孤児プロセス対策の実践

Featured image of the post

Claude Codeを複数セッション同時に走らせると、開発の並列度は一気に上がります。しかし筆者が実際に運用してみると、端末ごとプロセスが死ぬ・ブランチ切り替えで巻き込み事故が起きる・孤児プロセスが二重化する、といった落とし穴が次々に見つかりました。この記事では、tmux起動・git worktree分離・孤児プロセス対策という3本柱で、並行セッションを安定運用するための実践ノウハウを解説します。

この記事で分かること

  • claude を直接起動してはいけない理由と、tmux+セッションID発番による起動パターン
  • git worktreeで作業ディレクトリを分離し、ブランチ巻き込み事故を防ぐ手順
  • 「デタッチ孤児」プロセスの見分け方と、--resume 前に必ずやるべき掃除
  • tmuxの入れ子警告への対処と、共有リソースを奪い合わないための運用の考え方
📣
Claude Code・AIエージェントの開発導入・運用設計のご相談はお気軽にどうぞ!

[目次を開く]

1. なぜ並行セッションは「素朴に起動」すると壊れるのか

Claude Codeのセッションを2本、3本と同時に走らせたくなる場面は多いです。長時間のリファクタリングを流しながら、別セッションで調査を進める、といった使い方ですね。

ところが素朴に運用すると、次の3つの事故が起きます。

  1. 端末巻き添え死: GUIターミナルで直接起動したセッションが、端末ごとkillされて数秒〜数十秒で死ぬ
  2. ブランチ巻き込み事故: 同じ作業ディレクトリで別セッションがブランチを切り替え、もう一方の作業が壊れる
  3. 孤児プロセスの二重化: 死んだはずのプロセスが残ったまま --resume して、同じセッションが二重に動く

以降のセクションで、それぞれの対策を順に見ていきます。

2. tmux経由で起動する — 端末巻き添え死を防ぐ

筆者の環境では、gnome-terminalなどのターミナルで claude を直接起動すると、外部要因で端末ごとkillされ、起動から数秒〜数十秒でセッションが死ぬ現象に悩まされました。原因が何であれ、プロセスの生存を端末の生存に依存させていることが根本の問題です。

tmux内で起動すれば、端末を閉じてもtmuxサーバーがセッションを保持し続けるため、この問題は起きません。

さらに一歩進めて、セッションIDを自前で発番し、tmuxセッション名をそのIDに紐づけておくのがおすすめです。

# セッションIDを発番し、tmuxセッション名に埋め込んで起動
SID=$(uuidgen)
tmux new-session -d -s "claude-${SID:0:8}" "claude --session-id $SID"

# あとから入る
tmux attach -t "claude-${SID:0:8}"

こうしておくと、tmuxセッション名を見ればどのClaude Codeセッションが動いているか一目で分かり、同じIDのセッションを二重起動する事故を防げます。後から再開したいときも、同じtmuxセッションにattachし直すだけで済みます。

3. git worktreeで作業ディレクトリを分離する

並行セッションの最大の地雷が、同じ作業ディレクトリの共有です。セッションAが作業中に、セッションBが git checkout でブランチを切り替えると、Aから見えるファイルが突然すり替わり、編集途中の変更が意図しないブランチに乗るなどの巻き込み事故が起きます。

対策はシンプルで、セッションごとに独立したgit worktreeを切ることです。worktreeは同じリポジトリの別ブランチを別ディレクトリに展開する仕組みで、メインの作業ツリーのHEADや未コミット変更には一切触れません。

# 別ブランチを別ディレクトリに展開
git worktree add ~/worktrees/feature-xxx -b feature/xxx

# そのディレクトリでClaude Codeを起動
cd ~/worktrees/feature-xxx
SID=$(uuidgen)
tmux new-session -d -s "claude-${SID:0:8}" "claude --session-id $SID"

コミット時は git add . ではなく、触ったファイルだけを明示的にステージします。並行作業中は自分が意図しない差分が紛れ込むリスクが常にあるからです。

git add src/foo.ts src/bar.ts
git commit -m "feat: xxx"

マージが終わったら掃除を忘れずに。

git worktree remove ~/worktrees/feature-xxx

ブランチ運用の基本についてはGitでブランチを作成する方法も参考にしてください。

4. 「デタッチ孤児」問題 — resume前に必ず掃除する

並行運用でいちばん気づきにくいのが、筆者が「デタッチ孤児」と呼んでいる問題です。

端末(pty)を失ったclaudeプロセスが、親を失ってPID 1に里子化したまま生き残ることがあります。見分け方は、プロセスのfd 0(標準入力)が /dev/pts/N (deleted) を指しているかどうかです。

# claudeプロセスの標準入力を確認
for pid in $(pgrep -f "claude"); do
  echo "PID $pid: $(ls -l /proc/$pid/fd/0 2>/dev/null | awk '{print $NF}')"
done

危険なのは、孤児を残したまま claude --resume することです。孤児と新プロセスが同じセッションで二重に動き、挙動が壊れます。resume前には孤児をkillしてから再開してください。

flowchart TD
    resumeReq["セッションを再開したい"] --> checkTmux{"該当のtmuxセッションは残っている?"}
    checkTmux -- "はい" --> attach["tmux attach で再利用(二重起動しない)"]
    checkTmux -- "いいえ" --> checkOrphan{"fd0が /dev/pts/N (deleted) の孤児claudeがいる?"}
    checkOrphan -- "はい" --> killOrphan["孤児プロセスをkill"] --> doResume["claude --resume で再開"]
    checkOrphan -- "いいえ" --> doResume

整理すると、こうなります。

  • デタッチ(Ctrl+b d)は常に安全。セッションはtmux内で生き続けます
  • 危ないのはkillだけ。特に端末ごと落ちたときに孤児が発生します
  • tmux経由のセッションは /exit でクリーンに終了でき、孤児化しません

5. tmuxの入れ子警告に正しく対処する

tmux内のClaude Codeから、さらに別セッションを立ち上げようとして tmux new を実行すると、こんな警告が出ることがあります。

sessions should be nested with care, unset $TMUX to force

これはすでにtmuxセッション内にいるサインです。echo $TMUX で確認できます(値が入っていればtmux内)。

このとき無理に入れ子でセッションを作るのではなく、次のいずれかを使います。

  • Ctrl+b % — ペイン分割で同じセッション内に作業領域を増やす
  • Ctrl+b c — 新しいウィンドウを開く
  • Ctrl+b d — いったんデタッチしてから、外で tmux new する

6. 共有リソースは奪わない — 並行運用の作法

最後に、ツールでは解決できない運用面の話です。並行セッションは、ブラウザ自動化用のブラウザのような共有リソースを取り合うことがあります。

筆者のルールは「使用中のリソースは奪わない」の一点です。別セッションがブラウザで検証中なら、こちらはブラウザを起動し直すのではなく、デプロイ成果物をgrepして確認するなど、代替の検証手段に切り替えます。リソースを強制的に奪うと、相手のセッションの検証が壊れ、結局両方やり直しになるからです。

なお、1セッション内での並列ツール実行にも別種の落とし穴があります。詳しくはClaude CodeのAPI Error 400とツール並行実行の問題を参照してください。

7. よくある質問

Q. tmuxを使わずにnohupやsetsidで起動するのはダメですか?

プロセスの生存だけなら可能ですが、対話的なセッションに後からattachできる点でtmuxが圧倒的に有利です。Claude Codeは対話が前提のツールなので、デタッチ・再アタッチできるtmuxをおすすめします。

Q. worktreeを切らずにブランチだけ分ければ安全ですか?

いいえ。同じ作業ディレクトリを共有している限り、どちらかが git checkout した瞬間に、もう一方のセッションが見ているファイルがすり替わります。並行セッションの数だけworktreeを切るのが原則です。

Q. 孤児プロセスを放置するとどうなりますか?

そのままでは害が見えにくいのですが、claude --resume した瞬間に孤児+新プロセスの二重化が起き、セッションの挙動が壊れます。resume前の孤児チェックを習慣にしてください。

Q. tmuxセッションをデタッチしたらClaude Codeの処理は止まりますか?

止まりません。デタッチはあくまで「画面から離れる」だけで、セッションはtmux内で動き続けます。長時間タスクを流してデタッチし、あとからattachして結果を確認する使い方が安全かつ便利です。

8. まとめ

  • claude の直接起動は端末巻き添え死のリスクがある。tmux経由で起動する
  • セッションIDを自前発番して claude --session-id <uuid> で起動し、tmuxセッション名をIDに紐づけると再利用・二重起動防止に効く
  • 並行セッションはセッションごとにgit worktreeを分離。コミットは触ったファイルだけ明示ステージ、マージ後は git worktree remove で掃除
  • fd0が /dev/pts/N (deleted)孤児claudeプロセスは --resume 前にkillする。デタッチは常に安全、危ないのはkillだけ
  • sessions should be nested with care はtmux入れ子のサイン。Ctrl+b % / Ctrl+b c を使うか、デタッチしてから作る
  • 共有リソース(ブラウザ等)は使用中なら奪わず、代替の検証手段に切り替える

関連記事

業務効率化・DX推進でお悩みですか?

オンラインセッションで課題を可視化し、最適な解決策をご提案します。

  • DX推進を何から始めればいいかわからない
  • ツール導入を検討している
  • 社内でデジタル人材を育成したい
まずは無料で課題整理

相談は完全無料・オンラインで気軽に

あなたを爆速で成長させるメンタリングプログラムはこちら

メンタープログラムバナー

業務効率化・DX推進のご相談はこちら

伴走支援プログラムの詳細を見る

エンジニアの基礎学習ゲーム

プログラミング学習支援

無料相談はこちら