ランサーズ(Lancers)エンジニアブログ > DevOps > 複数ターミナルを操作するときの決定版!tmuxの使い方
tmux screen capture

複数ターミナルを操作するときの決定版!tmuxの使い方

blog_admin|2014年11月28日
DevOps

ランサーズのエンジニアのtomohiroです。
自分が普段使っているツールのひとつ、tmuxを紹介します。特に新しくはないですが、他の人の使い方も気になるんじゃないかなと思ったので、書いてみます。

tmux(terminal multiplexer)とは

1つのターミナルで複数の仮想端末を扱えるようになります。
この「1つのターミナル」をtmuxではsessionと呼んでいます。理由は後ほど。
ご存知の通りtmuxのプロセスが立ち上がるので、セッションの永続化ができ、突然ネットワークが切断されたり、窓を間違えて閉じたりしても、その状態から復帰が可能になります。

ちなみにtmuxは terminal multiplexer(ターミナルマルチプレクサ)の略です。名前の通り、1つのターミナルをマルチプレックスします。

tmux screen capture

tmux使用イメージ

なぜscreenではなくtmuxなのか?

似たソフトに GNU screen 等もありますが、個人的には tmux を使用しています。いくつか違いをピックアップすると以下の通りです。

画面分割

tmuxはデフォルトで画面の横分割、縦分割が出来ます。
(今はわかりませんが、tmuxに似た screen だとデフォルトで縦分割出来ない)

tmuxサーバー構成

tmux は仕組み上、tmuxはサーバーのように動きます。1つのセッションが立ち上がると、tmuxサーバーのインスタンスが立ち上がります。
tmuxサーバーは複数のセッションを管理出来るようになっていて、セッション間の行き来が楽になります。

導入手順(tmux.conf)

# epel が入ってないとダメだったと思います
$ sudo yum install tmux

# tmux用の設定ファイルを作成
$ vim ~/.tmux.conf

# .tmux.conf
# これは自分の使ってるconfです。(前の上司にもらった物、ほぼそのまま使ってます)参考までに
# ちなみに、基本的にキーバインドをスクリーン準拠にしてます。
# 後、自分は Ctrl + t 派の人間です。

# # # # # # # # # # # # # # # # # # # # # # # #
# ----------------------------------------------------------------------
# Window / Session Options
# ----------------------------------------------------------------------
set-window-option -g utf8 on
#set-option -g mouse-select-pane on
set-option -g base-index 0
# CopyMode vi
set-window-option -g mode-keys vi
# ----------------------------------------------------------------------
# Keybind
# ----------------------------------------------------------------------
# Prefix to C-t
set-option -g prefix C-t
unbind-key C-b
bind C-t send-prefix

# ----------------------------------------------------------------------
# Window / Pane
# ----------------------------------------------------------------------
# Open current pane to new window
bind ! break-pane -d
# Hirozontally / Vertically split pane
unbind -
bind - split-window -v
unbind |
bind | split-window -h
# move to upper / right / down / left pane
unbind k
bind k select-pane -U
unbind l
bind l select-pane -R
unbind j
bind j select-pane -D
unbind h
bind h select-pane -L
# resize pane
unbind K
bind K resize-pane -U 8
unbind L
bind L resize-pane -R 8
unbind J
bind J resize-pane -D 8
unbind H
bind H resize-pane -L 8

# ----------------------------------------------------------------------
# screen compatibile settings
# ----------------------------------------------------------------------
# go to prev window
unbind C-t
bind C-t last-window
# copy mode
bind Escape copy-mode
# rename window
bind A command-prompt "rename-window '%%'"
# list(choose) window
unbind '"'
bind '"' choose-window

# ----------------------------------------------------------------------
# etc
# ----------------------------------------------------------------------
# show clock :p
bind z clock-mode

利用手順

セッション開始

tmux new -t <session_name>

セッション再開

tmux a -s <session_name>

(↓ここから下はすべてtmux画面内のキーバインド)

新画面作成

Ctrl + t -> c

画面移動

次:Ctrl + t -> n
前:Ctrl + t -> p

画面分割

横:Ctrl + t -> –
縦:Ctrl + t -> |
プリセットのレイアウト: Ctrl + t -> space

パネル(分割)移動

左:Ctrl + t -> h
右:Ctrl + t -> l
上:Ctrl + t -> k
下:Ctrl + t -> j

こぼれ話

Macでiterm2をお使いの方は、iterm2のメニューに 「Shell」 > 「tmux」という項目があるみたいですね。最初まったく使い方がわからなかったのですが、ちょっと調べた結果ここまでわかりました。

下記のように、 -CC オプションをiterm2で、tmuxを使えるみたいです。

$ tmux -CC
$ tmux -CC attach

コマンドを打つと、iterm2のウィンドウが別途開きます。tmuxの操作をmacネイティブのiterm2で出来る事が売りみたいですね。
tmux慣れているとあんまり恩恵を感じないですが・・・

tmuxの使い方の話、いかがでしたか?
tmux.confいじりまくりで、全然デフォルトと違うじゃないかって突っ込まれそうですが、もしscreenと共存する必要があるならばかなりスムーズに移行出来るのではないでしょうか。