Claude Code の tmux 運用とは、Claude Code の席を tmux のセッションの中で起こし、端末の窓を閉じても会話が走り続けるようにする使い方です。

  • 席を tmux に置いて常駐させる手順と、席を並べた時に全部が 1 つのサーバに乗るという仕組み
  • TMUX_TMPDIR ではサーバを選べない事と、-S/-L で名指しする撃ち方
  • 当社がサーバごと席を失った記録と、そこから決めた見張り・起こし方・生死の確かめ方

tmux に席を置くと何が残り、何が 1 か所に集まるか

tmux の公式の説明書は、セッションは持続し、SSH の接続切れのような不意の切断や、意図した切り離し(detach)の後も生き残る、と書いています。切り離した後は tmux attach で戻れます(tmux(1)・2026-10-27 に見た)。Claude Code の席をこのセッションの中で起こしておけば、端末のアプリを閉じても、SSH が切れても、席の会話は続きます。長く走らせる席や、夜通し置いておく席(いわゆる 24 時間の常駐)に向く形です。

同じ説明書には、もう 1 つ大事な事が書かれています。セッションは全部 1 つのサーバが持ち、サーバとクライアントはソケットを通して話す、という事です。さらに kill-server は「サーバとクライアントを止め、全部のセッションを壊す」命令です(tmux(1)・2026-10-27 に見た)。席を何本並べても、既定のソケットに繋いでいる限り、乗っているのは同じ 1 つのサーバです。端末を閉じても席が死なない代わりに、サーバが死ねば席は全部同時に終わります。

Claude Code の側にも tmux に触れる所があります。作業木(worktree)ごとに tmux のセッションを作る --tmux の旗(--worktree と組で使う)が在り(CLI リファレンス・2026-10-27 に見た)、エージェントチームの分割ペインも tmux か iTerm2 で動きます(エージェントチーム・2026-10-27 に見た)。作業木の分け方は Claude Code の並列実行、席に仕事ごと任せる考え方の全体は AIエージェント の頁にまとめています。

席を tmux に置いて常駐させる手順

やる事撃つ物気をつける所
サーバを決めるtmux -L <サーバの名> … か tmux -S <ソケットの道> …以後の命令は全部、同じ -L/-S を付けて撃つ。TMUX_TMPDIR で選んだつもりにならない
席を起こすtmux -L <サーバの名> new-session -d -s <名前> -c <作業のフォルダ> claude席ごとにセッションを分ける。起こす元は SSH の 1 本に揃える(下の節)
席を見る・戻るtmux -L <サーバの名> attach -t <名前>抜ける時は切り離し(C-b d)。席は止まらない
生きている席を数えるtmux -L <サーバの名> list-sessions自前の一覧の表ではなく、サーバに直に聞く
席を 1 本だけ畳むtmux -L <サーバの名> kill-session -t <名前>行き先の無い kill-server・pkill tmux は使わない

出典: https://man.openbsd.org/tmux.1(2026-10-27 に見た・-L/-S・new-session・attach・list-sessions・kill-session・kill-server の説明)。気をつける所の列は、下の社の実測(2026-09-18・2026-09-20・2026-09-25・2026-10-02)から決めた当社の使い方です。

-L は名前だけでソケットを分け、別々のサーバを幾つも走らせるための旗です。-S はソケットの道を丸ごと指す旗で、-S を付けると既定のソケットのフォルダは使われず、-L も無視されます(tmux(1)・2026-10-27 に見た)。どちらでも、命令ごとに行き先のサーバが文字で残るのが利点です。Claude Code のエージェントチームの頁も、残ったセッションを畳む時は tmux ls で見てから kill-session -t でそのセッションだけを終えるよう書いています(エージェントチーム・2026-10-27 に見た)。

社の実測: 席の中から撃った kill-server が本物のサーバに当たった

当社の機体で、席を並べていた tmux のサーバが消え、走っていた席 13 本の会話が同じ秒に終わりました(社の実測 2026-10-02)。

たどると、ある席が自分の tmux の窓の中から TMUX_TMPDIR=<別の道> tmux kill-server を撃っていました。別のフォルダのサーバで試すつもりの 1 行でしたが、tmux は環境変数 $TMUX が在る時、つまり tmux の中で撃たれた時は TMUX_TMPDIR を見ません。隔離したつもりの試しが、席の乗っている本物のサーバに当たりました(社の実測 2026-10-02)。$TMUX は、tmux が中から命令を撃てるように内部の情報を入れて渡す変数です(tmux(1)・2026-10-27 に見た)。tmux の窓の中で走る席は、この変数を持ったまま命令を撃ちます。

使い捨てのサーバで同じ事を再現し、撃ち方ごとに結果を分けました。

撃ち方(tmux の窓の中から)当たった先使い捨てでない側のサーバ
TMUX_TMPDIR=<別の道> tmux kill-server$TMUX の指すサーバ(本物)消えた
env -u TMUX TMUX_TMPDIR=<別の道> tmux kill-server別の道のサーバ生き残った
tmux -S <ソケットの道> kill-server/tmux -L <名> kill-server名指ししたサーバ生き残った

出典: 社の実測 2026-10-02(使い捨てのサーバでの再現と、env -u TMUX・-S/-L の陰性対照)。

直しは、席の道具の前に置く見張り(hook)で、行き先の無い kill-server と pkill tmux を止める事にしました(社の実測 2026-10-02)。Claude Code の PreToolUse の hook は道具の呼び出しの前に走り、その呼び出しを止められます。止める時は終了コード 2 で抜け、stderr の文が理由として席に渡ります(フックでワークフローを自動化する・2026-10-27 に見た)。次は、その形に合わせた見張りの例です。

#!/bin/bash
# .claude/hooks/guard-tmux.sh(Bash の PreToolUse に登録する例)
CMD=$(jq -r '.tool_input.command // empty')

if echo "$CMD" | grep -qE '(^|[;&| ])pkill([[:space:]]+-[^[:space:]]+)*[[:space:]]+tmux'; then
  echo "Blocked: pkill tmux は全部の席を止める。kill-session -t で 1 本ずつ畳む" >&2
  exit 2
fi

if echo "$CMD" | grep -q 'kill-server' && ! echo "$CMD" | grep -qE 'tmux[[:space:]].*-[SL][[:space:]]'; then
  echo "Blocked: kill-server は -S か -L で行き先のサーバを名指しして撃つ" >&2
  exit 2
fi

exit 0

この例では、TMUX_TMPDIR=… tmux kill-server の形も名指しが無いので止まります。止まった時は、席が -S か -L を付けて撃ち直すか、人に回すかを選べます。

TMUX_TMPDIR はサーバを選ぶ道具ではない

説明書では、TMUX_TMPDIR はソケットを入れるフォルダの親で、在るフォルダの絶対の道でなければならない、とされています(tmux(1)・2026-10-27 に見た)。当社が確かめた所、TMUX_TMPDIR はソケットの道を組み立てるのに使われるだけで、その道のフォルダが無いと、tmux は何も言わずに既定のソケットへ落ちました(社の実測 2026-09-18)。

つまり「TMUX_TMPDIR でサーバを選んで、席を数えた」つもりの測りは、既定のサーバを測っただけになりえます。tmux -S <ソケットの道> で名指しして撃ち直すと、在るサーバは 3 本・13 本と別々に数えられ、無い道は error connecting と返って「測れない」と分かりました。3 つの値が、それぞれ正しく出ました(社の実測 2026-09-18)。

試しの席を立てる時も同じ所で躓きました。試しの席 3 本を TMUX_TMPDIR で隔離したつもりで立てたら、立てた席自身が tmux の中に居たので $TMUX が勝ち、本物のサーバに立ちました。その場で、自分が立てた 3 本だけを名指しで畳みました(社の実測 2026-10-18)。以後、試しのサーバは env -u TMUX を付け、短い TMUX_TMPDIR を渡して隔離しています(社の実測 2026-10-18)。

サーバを誰に起こさせるか: SSH から起こしたサーバに揃える

Mac の launchd(予約の仕組み)から起こした tmux のサーバの中では、席がデスクトップのフォルダを読む所で、macOS の許可(TCC)の返事待ちのまま止まりました。同じ事を SSH から起こしたサーバの中でやると通りました(社の実測 2026-10-02)。違いは、許可の責任を持つ親が誰か、という所にあります。tmux の席は、サーバを起こした者の側の扱いを引き継ぎます。

そこで当社は、サーバの立て直しは SSH から起こした 1 本に揃え、予約の仕組みにはサーバを起こさせない、と決めました(社の実測 2026-10-02)。時刻で席を起こしたい時は、在るサーバに席を足すだけにします。時刻で起こす仕組みそのものは Claude Code の定期実行 の頁に書いています。SSH から起きた窓でキーチェーンが読めずにログインが外れる件は、Claude Code のアカウント切り替え の頁で扱っています。

席が生きているかは、tmux のサーバに直接聞く

別の日にも tmux のサーバが消え、席 20 本の会話が数秒で全部終わりました。その時、当社の席の一覧の表は、全部の席が「走っている」のままでした。表が嘘になったわけです(社の実測 2026-09-25)。原因は確定していません。その時の交換領域(swap)の使用は 81% でした(社の実測 2026-09-25)。この日から、席の生死は自前の表ではなく、tmux -L <サーバの名> list-sessions のようにサーバへ直に聞いて確かめています。

逆向きの間違いもありました。「tmux の窓の中に居ない claude は孤児」と判定する道具に、孤児を止める --fix を当てる前に、1 件ずつ親のプロセスをたどりました。すると、VS Code の端末で走る席、走行中の定期便、SSH 越しの 1 回きりの席の、生きた席 6 本を孤児と呼んでいました(社の実測 2026-09-20)。撃たずに止め、孤児の判定は「tmux に居ないこと」ではなく、「親が launchd(ppid=1)で、かつ端末を持たない」で見るように改めました(社の実測 2026-09-20)。tmux の外で正しく走る席は在る、という前提で数えます。サブエージェントとして走る仕事の扱いは Claude Code のサブエージェント の頁にあります。

よくある質問

Claude Code を tmux で動かすと、端末を閉じても止まりませんか?

止まりません。tmux のセッションは、SSH の接続切れや切り離しの後も生き残り、後で tmux attach で戻れます(tmux(1)・2026-10-27 に見た)。ただし tmux のサーバが消えると、その上の席は全部同時に終わります。

Claude Code を 24 時間常駐させる時、一番気をつける事は何ですか?

席を全部載せている tmux のサーバを、行き先を書かない 1 行で消さない事です。当社では、席の中から撃った kill-server が本物のサーバに当たり、席 13 本が同じ秒に終わりました(社の実測 2026-10-02)。-S/-L で名指しする事と、名指しの無い kill-server・pkill tmux を hook で止める事で防いでいます。

TMUX_TMPDIR を変えれば、別の tmux のサーバを使えますか?

確実ではありません。tmux の中から撃つと $TMUX が勝ち、TMUX_TMPDIR は見られませんでした(社の実測 2026-10-02)。フォルダが無い時は黙って既定のソケットへ落ちます(社の実測 2026-09-18)。サーバを選ぶ時は tmux -S <ソケットの道> か tmux -L <名> で名指しします。

launchd から tmux を起こして Claude Code を走らせてもよいですか?

当社は避けています。launchd から起こしたサーバの中では、席がデスクトップのフォルダを読む所で macOS の許可待ちで止まり、SSH から起こしたサーバでは通りました(社の実測 2026-10-02)。サーバは SSH から起こした 1 本に揃え、予約の仕組みには起こさせません。

出典

  1. OpenBSD manual「tmux(1)」 https://man.openbsd.org/tmux.1(2026-10-27 に見た・セッションが切断と切り離しの後も持続する事・1 つのサーバとソケット・-L/-S・TMUX の変数・TMUX_TMPDIR・kill-server・kill-session)
  2. Claude Code ドキュメント「CLI リファレンス」 https://code.claude.com/docs/ja/cli-reference(2026-10-27 に見た・--tmux の旗)
  3. Claude Code ドキュメント「エージェントチーム」 https://code.claude.com/docs/ja/agent-teams(2026-10-27 に見た・分割ペインに tmux か iTerm2 が要る事・残った tmux のセッションを kill-session -t で畳む事)
  4. Claude Code ドキュメント「フックでワークフローを自動化する」 https://code.claude.com/docs/ja/hooks-guide(2026-10-27 に見た・PreToolUse が道具の呼び出しの前に走り、終了コード 2 で止められる事)
  5. 社の実測 2026-10-02(席の中から撃った kill-server でサーバが消え席 13 本が同じ秒に終わった件・使い捨てのサーバでの再現と陰性対照・hook で止める直し)
  6. 社の実測 2026-10-02(launchd から起こしたサーバで席が TCC 待ちで止まり、SSH から起こしたサーバでは通った件)
  7. 社の実測 2026-09-18(TMUX_TMPDIR のフォルダが無いと既定のソケットへ落ちる事と、-S で名指しした測り)
  8. 社の実測 2026-09-25(サーバが消え席 20 本が数秒で終わり、席の一覧の表が全部「走っている」のままだった件・その時の交換領域の使用 81%)
  9. 社の実測 2026-09-20(孤児の判定の道具が生きた席 6 本を孤児と呼んでいた件)
  10. 社の実測 2026-10-18(試しの席 3 本が $TMUX の勝ちで本物のサーバに立った件と、以後の隔離の仕方)