tmuxでClaude Codeのセッションを維持する
ターミナルのエージェントは、ターミナルの中で動いています。ウィンドウを閉じれば、エージェントも消えます。SSH接続が切れても、エージェントは消えます。tmuxを使うと、エージェントはセッションの中で動き、ターミナルはそれを表示するだけになります。目を離しても、セッションは動き続けます。当社がすべてのエージェント用Macで使っている設定を、実際のコマンドとともに紹介します。
インストールと起動
brew install tmux tmux new -s agent
これでagentという名前のセッションの中にいます。ほかのコマンドと同じように、ここでエージェントを起動します。
claude
Codexの場合は、代わりにCodexのコマンドを実行します。このページの内容は、どちらのツールでも同じように使えます。
デタッチして戻る
Ctrl-bを押して離し、次にdを押します。ターミナルはシェルに戻り、エージェントはバックグラウンドで作業を続けます。マシン上のどのターミナルからでも、名前を指定してアタッチすれば戻れます。
tmux attach -t agent
名前を忘れたら、動いているセッションを一覧表示します。
tmux ls
スマートフォンから再開する
スマートフォンにSSHクライアントをインストールします。よく使われるのはTermiusとBlink Shellです。Macに接続し、同じセッションにアタッチします。エージェントが何をしているかがそのまま見え、入力もできます。スマートフォンのキーボードは長いプロンプトには不向きです。そのため多くの人は、スマートフォンでは進み具合の確認と質問への回答だけをします。本格的な作業はノートPCから行います。
Claude Codeに限っては、SSHよりRemote Controlのほうがスマートフォンで使いやすいです。ターミナルを使わずに、Claudeアプリを実行中のセッションにつなげます。設定方法はClaude Codeを24時間動かすガイドで説明しています。それでも裏ではtmuxが重要です。Remote Controlがつなぐ先のセッションが存在している必要があるからです。
使いやすくする
2つの設定で、エージェントの作業でのtmuxがずっと使いやすくなります。ホームフォルダの.tmux.confというファイルに書きます。
set -g mouse on set -g history-limit 50000
1つ目の設定で、トラックパッドや指でスクロールできるようになります。2つ目の設定で、1時間前にエージェントが何をしたかを読めるだけの出力が残ります。ファイルを保存したらtmuxを再起動するか、セッション内から再読み込みします。
tmux source-file ~/.tmux.conf
再起動を乗り越える
tmuxのセッションはメモリ上にあります。再起動すると消えます。無人で動かすマシンなら、セッションが自動で戻ってくるべきです。ログイン時に動くLaunchAgentでそれができます。次の内容を、ホームのLibrary内のLaunchAgentsフォルダに、dev.local.agent-session.plistという名前で保存します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key><string>dev.local.agent-session</string>
<key>ProgramArguments</key>
<array>
<string>/bin/sh</string>
<string>-c</string>
<string>/opt/homebrew/bin/tmux has-session -t agent 2>/dev/null || /opt/homebrew/bin/tmux new -d -s agent</string>
</array>
<key>RunAtLoad</key><true/>
<key>StartInterval</key><integer>60</integer>
</dict>
</plist>一度読み込めば、ログインのたびに実行され、その後も1分ごとに確認します。
launchctl load ~/Library/LaunchAgents/dev.local.agent-session.plist
これが作るのは空のセッションです。中のエージェントは、あえて再起動しません。誰も起きていないときに、エージェントが自分で再起動して途中のタスクに戻ると、思わぬ事態を招きます。LaunchAgentが動くセッションを用意するため、そのユーザーの自動ログインを有効にします。タスクは、次にアタッチしたときにご自身で始めてください。
2つのセッションで2つのエージェント
同じマシンで、あるセッションではClaude Code、別のセッションではCodexを動かしてもかまいません。2つのリポジトリで2つのClaude Codeセッションを動かすこともできます。セッションには作業内容に合わせた名前を付けます。
tmux new -s api-refactor tmux new -s ios-tests
同じファイルを編集し合わないよう、エージェントごとに別のリポジトリのチェックアウトを使います。Gitのworktreeを使えば手軽にできます。
よくある質問
Macがスリープしても、tmuxならエージェントは動き続けますか?
+
いいえ。tmuxが守るのは、ターミナルが閉じた場合と接続が切れた場合です。スリープはtmuxを含むマシン全体を凍結します。スリープは電源設定で別に対策し、その上でtmuxを使ってください。
tmuxとscreenの違いは何ですか?
+
どちらも同じ問題を解決します。tmuxは開発が続いていて、Homebrewで入手でき、上で紹介したマウスとスクロールバックの設定があります。慣れているほうを使ってください。コマンドは違いますが、考え方は同じです。
アタッチする前のエージェントの出力を見られますか?
+
はい。セッション内で上にスクロールします。残す行数はhistory-limitの設定で決まります。マウスモードがオンなら、トラックパッドでスクロールできます。オフなら、Ctrl-bのあとに左角かっこのキーを押してスクロールし、qで抜けます。
ホスト型のMacでも使えますか?
+
はい。当社のエージェント用Macもこの方法で設定しています。ログイン時にagentという名前のセッションが作られ、選んだエージェントがその中で動きます。ブラウザで開くデスクトップでは、ターミナルのウィンドウがそのセッションにアタッチされています。