
tmuxとは、1つの端末の中に複数の作業画面(セッション・ウィンドウ・ペイン)を作り、SSHが切れてもサーバー側で処理を動かし続けられるターミナルマルチプレクサです。長時間のapt upgradeやrsyncを回線の切断から守りたい、ログを見ながら別の画面で作業したい、というサーバー作業の悩みを1つのツールで片付けられます。
以下のコマンドと出力は、Ubuntu 24.04の標準パッケージであるtmux 3.4で確かめたものです。最初に覚えるキー操作、理由つきの最小限の.tmux.conf、監視用の3ペインをスクリプトで作る方法、作業ログを残すpipe-paneまで、情シスやインフラ担当のサーバー作業で使う順に並べています。
この記事でわかること
- セッション・ウィンドウ・ペインの関係と、SSHが切れても処理が止まらない仕組み
- 最初に覚えるキー操作と、スクロール・コピーのやり方
- 各行の理由を説明できる最小限の.tmux.conf
- 監視用の3ペインを作るスクリプトと、
pipe-paneによる作業ログ - ネストや複数ペインへの同時入力で事故を起こさないための注意点
tmuxとは:セッション・ウィンドウ・ペインと、切断に強い仕組み
tmuxはクライアントとサーバーに分かれて動きます。tmuxと打つと裏でtmuxサーバーが起動し、画面の中で動くシェルやコマンドはすべてこのサーバーの子プロセスになります。端末に映っているのはサーバーにつないだクライアントにすぎないので、SSHが切れて消えるのはクライアントだけで、サーバーと中の処理は動き続けます。クライアントとサーバーは/tmp/tmux-<UID>/defaultのUNIXソケットでつながっており、rootなら/tmp/tmux-0/defaultです。
| 単位 | 中身 | 作るコマンド・キー | 使い分けの目安 |
|---|---|---|---|
| セッション | ウィンドウの束。デタッチ・アタッチの単位 | tmux new -s 名前 | 作業や案件ごとに1つ(例:work、ops) |
| ウィンドウ | 画面全体を使うタブ | プレフィックスのあとc | サーバーや作業フェーズごとに1つ |
| ペイン | ウィンドウを分割した区画 | プレフィックスのあと%または" | 同時に見たいもの(ログと操作用シェルなど) |
tmuxのインストールと基本的な使い方
UbuntuやDebianはaptで入り、24.04ではtmux 3.4になります。macOSはHomebrewのbrew install tmux、WindowsはWSL2のUbuntuにaptで入れて使います。まずはセッションを作って抜け、戻るまでを一通り試します。
sudo apt install -y tmux
tmux -V # tmux 3.4
tmux new -s work # work という名前のセッションを作って入る
# (中で作業し、Ctrl-b を押して離してから d でデタッチ)
tmux ls # セッションの一覧
tmux attach -t work # work に戻る
tmux new -A -s work # あれば入り、なければ作る(ログイン直後用)
tmux kill-session -t work # セッションを終了するwork: 1 windows (created Wed Sep 23 23:09:21 2026)tmuxの操作は「プレフィックスキーを押して離してから、コマンドのキーを押す」2段階です。既定のプレフィックスはCtrl-bで、以降「Ctrl-b d」はCtrl+bを押して離したあとにdを押す意味で書きます。tmux new -A -s workは、SSHでログインするたびに同じセッションへ入り直したいときの定番で、存在すればアタッチ、なければ作成と動きが切り替わるため、何度打ってもduplicate sessionになりません。
SSHが切れても処理が続くことは、簡単に確かめられます。セッションの中でfor i in 1 2 3; do echo tick $i; sleep 1; doneのような処理を動かしてデタッチし、数秒後にアタッチし直すと、離れていた間のtick 1〜tick 3がそのまま画面に残っています。
最初に覚えるキー操作
いずれもCtrl-bのあとに押すキーです。全部を覚える必要はなく、デタッチ(d)、分割(%と")、移動(矢印キー)、最大化(z)、スクロール([)の6つで日常の作業は回ります。忘れたら?で一覧が出ます。
| やりたいこと | キー(Ctrl-bのあと) |
|---|---|
| デタッチ(セッションから抜ける) | d |
| ウィンドウを作る/次へ/前へ | c / n / p |
| 番号でウィンドウを選ぶ | 0〜9 |
| ウィンドウ名を変える | , |
| セッション・ウィンドウを一覧から選ぶ | s / w |
| 左右に分割/上下に分割 | % / " |
| ペインを移動 | 矢印キー、またはoで順番に |
| ペインを最大化・元に戻す | z |
| ペインを閉じる(確認あり) | x |
| ペインの番号を表示 | q |
| レイアウトを順に切り替える | スペース |
| コピーモード(スクロール)に入る/貼り付け | [ / ] |
| キー割り当ての一覧 | ? |
スクロールとコピー:コピーモードの使い方
tmuxの中では、端末エミュレーターのスクロールバーで過去の出力をさかのぼれません。画面の内容はtmuxが持っているため、Ctrl-b [でコピーモードに入り、PageUp・PageDownや矢印キーで移動します。抜けるときはqです。mode-keysをviにしていれば/と?で文字列を検索でき、エラーメッセージを探すときに重宝します。さかのぼれる行数はhistory-limitで決まり、既定は2000行です。
コピーは、コピーモードで範囲を選んで確定し、Ctrl-b ]で貼り付けます。後述の.tmux.confでは、Vimと同じくvで選択開始、yでコピーにしています。マウスのホイールでスクロールしたいならset -g mouse onを入れます。この場合、端末エミュレーター側の通常のテキスト選択は、多くの端末でShiftを押しながらのドラッグに変わります。
.tmux.conf:最小限の設定と各行の理由
# マウスでスクロール・ペイン選択・境界のドラッグ
set -g mouse on
# さかのぼれる行数(既定 2000)
set -g history-limit 50000
# ウィンドウとペインの番号を 1 から始める
set -g base-index 1
setw -g pane-base-index 1
# ウィンドウを閉じたら番号を詰める
set -g renumber-windows on
# Esc の後の待ち時間(既定 500ms)を短くして Vim の Esc を遅らせない
set -sg escape-time 10
# コピーモードを vi 風のキー操作にする
setw -g mode-keys vi
# 分割と新しいウィンドウを、今いるディレクトリで開く
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
bind c new-window -c "#{pane_current_path}"
# Ctrl-b r で設定を読み直す
bind r source-file ~/.tmux.conf \; display-message "reloaded ~/.tmux.conf"
bind -T copy-mode-vi v send-keys -X begin-selection
bind -T copy-mode-vi y send-keys -X copy-selection-and-cancel番号を1から始めるのは、キーボードの左端が1で、0が右端にあるためです。0始まりのままだと、左から1番目のウィンドウに移るのに右端の0を押すことになります。escape-timeはtmux 3.4の既定が500ミリ秒で、tmuxの中でVimやNeovimを使うと、Escを押してからノーマルモードに戻るまで一拍遅れる原因になります。|と-の分割は形と向きが一致して覚えやすいうえ、-c "#{pane_current_path}"を付けないと、新しいペインはセッションを作ったディレクトリで開いてしまいます。
書き換えた設定は、tmuxの中でCtrl-b r(上の設定で割り当て)か、tmux source-file ~/.tmux.confで反映します。tmux source-file -n ~/.tmux.confは実行せずに構文だけを調べるオプションです。検証では、{の閉じ忘れはsyntax errorとして見つかった一方、引用符の閉じ忘れとset -g mose onのようなオプション名の打ち間違いはどちらも通ってしまいました。-nで問題がなくても、最後は実際に読み込んでエラーが出ないことを確かめます。
プレフィックスは、サーバー側では既定のCtrl-bのまま使うのがおすすめです。自分が設定を管理していないサーバーでも同じ指の動きで操作できるからです。手元のPCでもtmuxを使い、その中からSSHしてサーバーのtmuxに入る(ネストする)場合だけ、手元の.tmux.confでプレフィックスをCtrl-aに変えます。行頭へ移動するCtrl-aは、Ctrl-aを2回押せば中のシェルへ送れます。
set -g prefix C-a
unbind C-b
bind C-a send-prefixサーバー作業での使いどころ
1つ目の使いどころは、切断されると困る長時間の処理です。OSのアップグレード、大きなディレクトリのrsync、DBのダンプとリストアは、必ずtmux new -A -s workの中で始めます。回線が切れても、SSHし直して同じコマンドを打てば進捗が見える画面に戻れます。AIのコーディングエージェントをサーバー上で長く動かす場合も同じで、Claude Codeのような対話型のツールをtmuxの中で起動しておけば、ノートPCを閉じても作業は止まりません。
2つ目は、決まった監視画面の再現です。毎回手で分割するのではなく、スクリプトにしておくと数秒で同じ配置に戻せます。次のスクリプトは、左にtop、右上にvmstat、右下に操作用のシェルを置きます。{left}や{top-right}はtmuxが持つ位置指定の名前で、ペイン番号を使わないためpane-base-indexの設定に左右されません。
#!/usr/bin/env bash
# ops-layout.sh:監視用の3ペインを作ってアタッチする(2回目以降は既存のセッションに入る)
set -eu
S=ops
if tmux has-session -t "$S" 2>/dev/null; then
exec tmux attach -t "$S"
fi
tmux new-session -d -s "$S" -n mon
tmux split-window -h -t "$S:mon"
tmux split-window -v -t "$S:mon"
tmux send-keys -t "$S:mon.{left}" 'top -d 2' C-m
tmux send-keys -t "$S:mon.{top-right}" 'vmstat 2' C-m
tmux send-keys -t "$S:mon.{bottom-right}" 'df -h /' C-m
tmux select-pane -t "$S:mon.{bottom-right}"
exec tmux attach -t "$S"tmux -V
cat ~/ops-layout.sh
bash ~/ops-layout.sh3つ目は作業の記録です。pipe-paneを使うと、ペインに表示された内容をファイルへ流し続けられます。ファイル名には#S(セッション名)・#I(ウィンドウ番号)・#P(ペイン番号)が展開され、検証では~/tmux-log-1-1.logができました。作業の証跡を残す社内ルールがある場合に、端末ソフトのログ機能に頼らずサーバー側で残せます。同じコマンドをもう一度実行すると記録が止まります。
tmux pipe-pane -o 'cat >> ~/tmux-#S-#I-#P.log' # 記録の開始(もう一度で停止)
tmux capture-pane -p -S -3000 > ~/scrollback.txt # 画面と過去3000行を今すぐ保存
sed 's/\x1b\[[0-9;?]*[a-zA-Z]//g' ~/tmux-log-1-1.log | tr -d '\r' | lessログにはプロンプトの色やカーソル制御の文字(検証では[?2004hなど)がそのまま入るため、読むときは最後の行のようにsedで制御文字を取り除きます。パスワードを画面に表示する操作はそのまま記録されるので、記録中に機密情報をcatしないよう気をつけてください。
複数のサーバーにSSHしたペインへ同じ入力を送るsetw synchronize-panes onは便利ですが、1台だけ別のディレクトリにいた、1台だけ別のOSだった、という違いがあっても同じコマンドが実行されます。使うのはuptimeやdf -hのような読み取りだけの確認に限り、変更を加えるコマンドの前には必ずsetw synchronize-panes offに戻します。台数が多い作業は、Ansibleのような構成管理ツールに任せるほうが安全です。
つまずきポイント
| 症状・エラーメッセージ | 原因 | 対処 |
|---|---|---|
duplicate session: work | 同じ名前のセッションがすでにある | tmux attach -t workで入るか、最初からtmux new -A -s workを使う |
no server running on /tmp/tmux-0/default、またはno sessions | tmuxサーバーが動いていない。最後のセッションを閉じるとサーバーも終了する | tmux new -s 名前で作り直す。ログアウトで毎回消えるなら、systemd-logindのKillUserProcesses=yesを疑う(Ubuntuの既定はno) |
sessions should be nested with care, unset $TMUX to force | tmuxの中でさらにtmuxを起動しようとした | 今のセッション内でウィンドウを増やす。SSH先のtmuxを使うネストは、プレフィックスを分けてから行う |
invalid option: mose | .tmux.confのオプション名の打ち間違い | エラーに出たオプション名を直し、tmux source-file ~/.tmux.confで読み直す |
| tmuxの中だけVimの色や斜体が崩れる | tmux内の$TERMがscreenになっている。既定値はビルド時に決まる | tmuxの中でecho $TERMを確認し、infocmp tmux-256colorが成功する環境ならset -g default-terminal "tmux-256color"を追加 |
動作確認
.tmux.confが読まれているかはtmux showで値を見るのが確実です。監視用スクリプトを動かしたあとは、list-panesで3つのペインと、それぞれで動いているコマンドを確かめます。下の出力は幅80桁・高さ24行の端末で実行したときのものです。
$ tmux show -g history-limit
history-limit 50000
$ tmux show -gw pane-base-index
pane-base-index 1
$ tmux ls
ops: 1 windows (created Thu Sep 24 00:58:45 2026) (attached)
$ tmux list-panes -t ops:mon -F '#{pane_index} #{pane_width}x#{pane_height} #{pane_current_command} active=#{pane_active}'
1 40x23 top active=0
2 39x11 vmstat active=0
3 39x11 bash active=1よくある質問
tmuxでスクロールするにはどうしますか?
Ctrl-b [でコピーモードに入り、PageUp・PageDownや矢印キーで過去の出力をさかのぼります。qで元に戻ります。マウスのホイールで動かしたい場合は、.tmux.confにset -g mouse onを書きます。さかのぼれる行数はhistory-limitで決まり、既定の2000行では足りないことが多いです。
tmuxのセッションとは何ですか?
tmuxサーバーの中で動き続ける作業のまとまりで、1つ以上のウィンドウを持ちます。端末から切り離す(デタッチ)と画面は消えますが、中のシェルやコマンドは動いたままなので、別の端末やSSHし直した先からtmux attach -t 名前で同じ状態に戻れます。
tmuxはWindowsで使えますか?
コマンドプロンプトやPowerShellでは動かないため、WSL2のUbuntuにaptで入れて使うのが一般的です(MSYS2やCygwinにもパッケージはあります)。Windows Terminalで開いたWSL2のシェルからtmuxを起動すれば、この記事の操作と設定がそのまま使えます。WindowsからSSHしたLinuxサーバー上で動かす場合は、手元のOSを問いません。
tmuxはMacでも使えますか?
使えます。Homebrewのbrew install tmuxで入り、キー操作と.tmux.confの書き方はLinuxと同じです。ただしHomebrew版はサーバーのtmux 3.4より新しいことが多く、新しい版にしかないオプションを共通の.tmux.confに書くと、サーバー側でinvalid optionになります。共通化する前に両方のtmux -Vを確かめてください。
まとめ
切断されると困る作業はtmux new -A -s workの中で始め、戻るときも同じコマンドを打つ、という習慣だけで多くの事故は防げます。設定は番号の1始まり、escape-time、履歴の行数、現在のディレクトリで分割する設定から入れ、監視画面はスクリプトにして再現できるようにしておきます。synchronize-panesは読み取りの確認だけに使ってください。
次に読む
- ssh-keygenでSSH鍵を作る:tmuxで使うSSH接続を鍵認証とssh configで整える
- Neovim入門:init.luaの書き方とLSP・補完の設定:tmuxのペインで動かすエディタの設定
- chezmoiでdotfilesを管理する:.tmux.confを複数のサーバーへ同じ内容で配る