Terminal Multiplexer(tmux)の紹介 | サイバーエージェント 公式エンジニアブログ
みなさん、初めまして。


ネットビジネス総合事業本部 CAMP事業部のインフラを担当している福坂と申します。

今回が初投稿となります。

弊社には、OSをはじめVim/Emacs/Eclipseなどを自分好みに徹底的にカスタマイズしている人も多いのですが、
本投稿では私自身が作業効率を上げるために手放せないツールについて紹介したいと思います。


Terminal Multiplexer(tmux)の紹介


唐突ですが、「GNU Screen」を使ったことはありますか?


sshでサーバに接続して作業するような場合、「GNU Screen」を活用されている方も多いのではないでしょうか。
今回はGNU Screenに似ていて、実用的(?)なツール『tmux』についてご紹介させていただきます。


GNU Screenをご存知の方は実際に使ってみた方が早いかもしれませんが、
『tmux(Terminal Multiplexer)』はBSDライセンスで開発されており、
今ではOpenBSDのベースシステムの一部となっている仮想端末管理ソフトであり、
GNU Screenと同様に1画面で複数のターミナルを操作したりする際に重宝します。


また、開いた画面は縦横に分割、サイズ変更も可能で、ターミナルを開き過ぎて
混沌とした画面をスッキリさせ、作業効率の向上が期待できます。


デタッチ・アタッチ機能もGNU Screen同様実装されています。



例えば下のようなデスクトップが
サイバーエージェント 公式エンジニアブログ-fksk_01



このようにスッキリします。
サイバーエージェント 公式エンジニアブログ-fksk_02
※マニュアル参照、テキストエディット、ping、top、時計の5つを一つのウィンドウで表示しています。



tmuxでは画面の枠をウィンドウ、分割し区切られた領域をペイン(pane)と呼びます。
ペインはウィンドウ内で多数開くことができ、サイズも好みに調整できます。

下の画像は縦分割・横分割を繰り返して計8つのペインを開いた例です。
サイバーエージェント 公式エンジニアブログ-fksk_03



ペインを開きすぎても大丈夫。整列もできます。
サイバーエージェント 公式エンジニアブログ-fksk_04


活用方法は人それぞれですが、私の場合は複数のサーバにログインしたり、
片方ではエディタでテキストの編集、もう片方ではその他のコマンド実行といった使い方をよくします。
ターミナルをたくさん開く場合に比べ、見た目がスッキリしキーボードだけで大抵のことができるので、
作業効率向上につながっています。

個人的には時計の表示もお気に入りで、お昼ごはんに・・・(略



今回はサンプル画面を交えて簡単な使い方までをお伝えできれば幸いです。


■インストール

UNIX系OSやLinuxは大抵の場合パッケージが存在するので、

"yum install tmux"
"apt-get install tmux"
"pkg_add -r tmux"

などを試してみてください。


Mac OS Xの場合はFinkやMacPortsを使うとよいでしょう。
最近はHomebrewを使う人も増えている(?)ようなので"brew install tmux"でもOKです。
私は当ブログでおなじみMaedaさんにHomebrewの存在を聞いてからはずっと愛用しています。


もちろんソースをコンパイルしてインストールしてもOKです。
パッケージのバージョンが古い場合などは本家(http://tmux.sourceforge.net/)
より辿ってください。


2011年11月時点の最新バージョンは1.5です。


Windowsの場合は、、、Cygwinで動かせないか試してはみましたが失敗しました。

ローカルの仮想環境 or 他のサーバを踏み台にしてください。悪しからず。



■起動して使ってみる

インストールが完了したらターミナルで"tmux"と打つと起動します。
サイバーエージェント 公式エンジニアブログ-fksk_05


起動後も見た目は普通のターミナルです。
サイバーエージェント 公式エンジニアブログ-fksk_06
最下部の左寄りにある"0:bash*"が現在アクティブのウィンドウです。



それでは次に進みましょう。

・新しいウィンドウを開く

Ctrl + b><c
※ "Ctrl"を押しながら"b"を押して離す。続けて"c"を押す。
サイバーエージェント 公式エンジニアブログ-fksk_07
"0:bash*"から"0:bash- 1:bash*"となり、2つめのウィンドウ(1:bash*)が
新しく開いたウィンドウでアクティブ
であることを示しています。

アクティブかどうかはウィンドウ名右の"-"、"*"を見て判断します。


・ウィンドウを移動

Ctrl + b><p> 又は <Ctrl + b><n

上で"1:bash"がアクティブになっているので、もとの"0:bash"ウィンドウに移動します。
今はウィンドウが2つなので、"p"で戻っても"n"で進んでも"0:bash"に移動します。


・ウィンドウを横に分割

Ctrl + b><"
サイバーエージェント 公式エンジニアブログ-fksk_08
ウィンドウが縦の真ん中で2つのペインに分割されました。



・続けてウィンドウを縦に分割

Ctrl + b><%
サイバーエージェント 公式エンジニアブログ-fksk_09
分割した下側のペインが更に縦に分割されました。



・ウィンドウ内のペインを確認

Ctrl + b:display-panes
※ "Ctrl"を押しながら"b"を押して離す。続けて":display-panes"と入力してEnter。
※ ":"まで入力した時点でウィンドウの最下部に文字列が入力できるようになります。
サイバーエージェント 公式エンジニアブログ-fksk_10
ペインは0~2の3つあり、赤色の"2"がアクティブであることを示しています。


デフォルト設定での操作は上述のような流れです。
分割したペインはログアウトすると消えます。


ただし、このまま(デフォルト設定)の場合<Ctrl>と<b>が離れすぎで押しにくかったり、
そもそもbashの"1文字戻る操作"と重複していたりで都合が悪いときがあります。



そこで、各種キーバインドのカスタマイズが必要になる訳です。


■カスタマイズ

初期設定やキーバインドのカスタマイズはホームディレクトリの".tmux.conf"というファイルで行います。
(GNU Screenでいうところの.screenrcに相当)


以下は私のお勧め設定をピックアップして紹介します。
カスタマイズの詳細は"man tmux"で表示されるマニュアルを参照すると確実です(英語ですが)。

とりあえず起動した後、<Ctrl + b>が頻出していますが、
これをプレフィックスキー(以下Prefix)といい、各種操作をはじめるときのおまじないです。

デフォルトのおまじないはbashの操作と重複してしまうので、思い切って変えてしまいます。
その他の設定も併せて行うので、"${HOME}/.tmux.conf"に下記をコピー&ペーストしてください。

# Prefixを<Ctrl + b>から<Ctrl + t>に変えます。
# 例:新しいウィンドウを開くときは<Ctrl + t><c>と押すことになります。
# "t"以外の好きなキーにしても問題ありません。他の操作と重複しないようにしましょう。

set-option -g prefix C-t

# ウィンドウの移動
# Prefix(ここではCtrl+t)を連続入力することでウィンドウを移動させます。

bind C-t next-window


# ウィンドウを(ペインに)分割
# <Prefix><v>、<Prefix><h>と入力するだけで分割できるようにします。

bind v split-window -v
bind h split-window -h


# ペインのサイズ変更をvim風にする
# <Prefix><Ctrl + { h | i | j | k }>
# <Ctrl + { h | i | j | k }>は連続して入力可能。
# 1回押すごとに5行(列)境界を移動させる。

bind -r C-h resize-pane -L 5
bind -r C-l resize-pane -R 5
bind -r C-j resize-pane -D 5
bind -r C-k resize-pane -U 5


# ペインの移動1(Vim風にする)

bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R


# ペインの移動2
# Shift + 上下左右でペインを移動できるようにする。(<Prefix>不要)
# 行頭に"bind -n"をつけるとPrefixが不要になる。

bind -n S-left select-pane -L
bind -n S-down select-pane -D
bind -n S-up select-pane -U
bind -n S-right select-pane -R


コピー&ペーストが完了したら、tmuxを再起動すると.tmux.confに記述したキーバインドで操作が可能になります。
これに慣れると、複数のサーバにログインしながら、シェルスクリプトを実行しながら、ゲートウェイにpingを打ちながら、エディタでconfの編集だってサクサク操作できるはずです。


操作を忘れた場合は下記でコマンドのリストを表示することができます。

Prefix><?


■応用例

▼ コマンドを割りあてる
<Prefix><y>と入力すると、コマンド"command"を実行する例
.tmux.confに下記を記述します。
bind y send-keys 'command' Enter

頻繁に入力するコマンド(文字列)を定義しておき、指定したキーバインドで入力できます。


▼ tmux起動中に設定変更する
設定変更の度に.tmux.confを編集してtmuxを再起動するのは非効率なので、
その場合は下記要領で設定変更します。


・マウスでペインを選択する機能を有効/無効に切替える例

Prefix:set-option mouse-select-pane


・マウスのドラッグ操作によるペインサイズ変更を有効/無効に切替える例

Prefix:set-option mouse-resize-pane


・複数ペインで同時に操作を実行する機能を有効/無効に切替える例

Prefix:set-window-option synchronize-panes

これらは常時有効ではなく、使いたい時に有効にしたい設定の例です。
これら以外の設定も同様に(全てではないですが)変更可能です。


■まとめ
tmuxは使い方次第で作業効率を向上させることができる便利なツールです。
今回紹介した機能以外にも便利な機能や使い方(コピペなど)があるので、
少しでも気になった方は早速お試しください。
たまには普段何気なく使っている作業PCの設定を見なおして、
極端に改造してみてはいかがでしょうか。


せっかくの機会なので
<自己紹介>
2010年11月の中途入社 CAMP(http://www.ca-mp.jp/)のインフラエンジニア採用。
熊本出身。好きなOSはFreeBSD。最近買ったPCはMacBook Air 11.6 MC969J/A。
最近の悩みはM.S.さんと会話するとかなりの確率で違う苗字で呼ばれること(笑)