tmux - Terminal multiplexer

サーバーでなんらかしら処理を実行させている時に、接続してたセッションが切れてしまい、 それまで実行していた処理が台無しになった悲劇について、枚挙にいとまがありません。 nohup ~ & によるバックグラウンド実行ネタは典型かもしれませんが、 tmux(screen でもいいけど)で端末を仮想化してしまうのも手です。 繊細なオペレーションが必要な場合は tmux を使うくせを付けておきたいところ。

基本機能

起動方法

tmux new [コマンド...]
  または
tmux new-session [コマンド...]

新しい「セッション」を立ち上げます。 指定した「コマンド」が終了すると、そのまま tmux も終了してしまうため、 「コマンド」は指定せずに、デフォルトシェル(環境変数 SHELL 参照してる)で立ち上げて、 「コマンド」を実行しましょう。

終了方法

もちろんコマンドを終了すればいいので、シェルなら exit(logout)で終了します。 「他爆装置」的な機能も用意されていますが、どちらかというとトラブルシュート時に使うものになります。

一時的な切断

ターミナルが突然切断されても tmux で保護された仮想端末はそのまま処理し続けます。

人為的に(意図的)に切断したい場合は「PREFIX」を入力して「d」を入力して、で切断します。 PREFIX は tmux の場合 CTRL+b(コントロールキーを押しながら b を入力)となります(設定変更可)。 この場合「コントロールキーを押しながら b を入力、コントロールキーから手放して d を入力」操作となります。

なお GNU Screen の PREFIX は CTRL+a で、この手のツールの説明ではよく、 「PREFIX+d」ないしは「CTRL+b d」(CTRL+b が PREFIX として)ないしは、 「^b d」という表現で表されています。

勘のいい人なら「PREFIX+^d」(つまり CTRL+b CTRL+d)でも一時切断できるのに気がつくと思います。 使う人に優しいキーバインド。

セッションの一覧

tmux ls
  または
tmux list-sessions

複数の tmux セッションを立ち上げたときに、どの tmux に接続できるのか一覧で確認できます。

一時切断したセッションに接続する

tmux attach [-t <セッション番号>]
  または
tmux attach-session [-t <セッション番号>]

PREFIX+d で抜けた、あるいは、強制切断してしまったセッションに再接続したい時に指定します。

新しいウィンドウを作成する

セッション上に複数のウィンドウを開くことができます。 PREFIX+c ないしは PREFIX+^c です。

ウィンドウを切り替える

バックログを見る

PREFIX+[」でバックログ(過去の表示履歴)を見る状態に移行します。 この状態を「コピーモード」と言います。

カーソルキーで上下に移動可能です。 デフォルトで emacs キーバインドでスクロールすることが可能なのですが、 自分は普段 vi キーバインドで使用している(設定変更により)のと、 emacs キーバインドを忘れてしまったので、詳細は省略します。

このモードから脱出する場合は「q」を押します。

ウィンドウの縦分割(ペイン)

PREFIX+"」(ダブルクォート)でウィンドウを縦半分に分割します。

ウィンドウの横分割(ペイン)

PREFIX+%」(パーセント)でウィンドウを横半分に分割します。

ペイン間の上下左右移動

ウィンドウ間の移動と違って、戻るとか進むとか直前の…あるいは番号指定といった操作はありません。

ペインのサイズ変更

リサイズ=サイズ変更なので拡張か縮小しかないのですが、どういう理屈で拡大したり縮小するかはよくわかってないです:-)。

なお、CTRL の代わりに ALT(META)キーを押しながら…だと5行ないしは5桁単位でリサイズできます。

独断と偏見の推奨設定

いかんせん、PREFIX のデフォルトが CTRL+b である。GNU Screen からの移行で降るまいが慣れてない。 など、自分にとって使いづらいことこの上ないので、カスタムしています。 カスタム内容は ~/.tmux.conf に記載することで対応します。 tmux.conf の変更は新しいセッションで反映されますが、セッションが生き残ってると反映されません。

''PREFIX'' の変更

set-option -g prefix ^t
unbind-key ^b

tmux にせよ GNU Screen にせよ、微妙なキーをデフォルトにしているので、普段使わなさそうなキーを PREFIX に指定します。 自分は CTRL+t に決めました。

また「PREFIX+PREFIX」の振る舞いが GNU Screen とは違います。 tmux の場合PREFIXを特別扱いしません。 PREFIXであるところの「CTRL+b」としてキー割り当てが行われています。 また「CTRL+b そのものを入力する」機能が割り当てられています。

いずれにせよ、そんなキーは無効にするに限る。と。

直前のウィンドウに戻る

bind-key C-t last-window

GNU Screen と同じく「PREFIX+PREFIX」の挙動を「直前にウィンドウに戻る」とします。

バックログの保持行数の変更

set-option -g history-limit 10000

ステータス行の表示可否

set-option -g status off

画面下の行にステータスを表示したくない時に off に指定します。表示したい時(デフォルト)は on です。

ウィンドウの開始番号を指定する

set-option -g base-index 0

PREFIX+0 から PREFIX+9 まで10個のウィンドウを指定することができます。

自分の場合、0は特別扱いして普段使いは1から使うようにしています。 そのため base-index には 0 を指定しています。

キーボードを見ると、1~9、0という並びなので、1から始めると使いやすいかもしれません。 その場合は base-index に 1 を指定します。

いずれにしてもウィンドウの開始位置と自分の感覚が合うよう(お気に入り)に、何度も調整が必要です。

ウィンドウタイトルの表示変更可否・書式指定

set-option -g set-titles on
set-option -g set-titles-string "#T #S:#I"

tmux は XTerm 由来のウィンドウタイトルバーの変更機能(エスケープシーケンス)に対応しています。 この機能のオンオフ(set-titiles)や表示フォーマットの指定(set-titles-string)が可能です。

書式

表示内容

#T

ユーザー指定タイトル

#S

セッション番号

#I

ウィンドウ番号

他にもたくさんあるけど、あまり使い出が…。

ユーザー指定タイトルは XTerm 由来のウィンドウタイトルバー変更エスケープシーケンスに対応したアプリが設定した内容となります。

コピーモードのキーバインド

set-window-option -g mode-keys vi

ウィンドウの縦分割

ウィンドウの横分割

セッション・ウィンドウ・ペイン

tmux は以下の包含関係があります。

+- セッション -----------+
|                        |
|  +- ウィンドウ -----+  |
|  |                  |  |
|  |  +- ペイン ---+  |  |
|  |  |            |  |  |
|  |  |            |  |  |
|  |  |            |  |  |
|  |  +------------+  |  |
|  |                  |  |
|  +------------------+  |
|                        |
+------------------------+