ガイド

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という名前のセッションが作られ、選んだエージェントがその中で動きます。ブラウザで開くデスクトップでは、ターミナルのウィンドウがそのセッションにアタッチされています。

関連ガイド