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