tmuxはじめました

tmuxはじめました

100周ぐらい乗り遅れた感があるのですが、tmux(てぃーまっくす)というGNU Screenに似たシンプルな仮想端末ソフトを使いはじめました。sshでログインした後に使ったりします。

http://tmux.sourceforge.net/

下記のようなありがちな不満を解消してくれます。

  • 今動いているシェルターミナルの他に、シェルターミナルがもう一本欲しい。
  • ログアウトしていてもプログラムが動作していてほしい(従来はnohupかC-z -> bg -> disownでやっていたこと)
  • もっかいログインしたら続きからやりなおしたい
  • 画面上を流れる出力をじっくり見たり、コピペしたりしたい。
  • シェルの画面を分割したい。

リモート上で動くTeratermみたいなものですね。他人とシェル画面を共有したりもできたりします。(画面シェアしている場合はつないでいる人の最小画面サイズに調整される)

最近のUbuntu serverにはデフォルトで入っていると思います。

root@ubuntuserver:~# tmux -V
tmux 1.8

OS XでもHomebrewで入れられるはずなので、ぜひ使いましょう。

tmuxメモ

Ubuntu server 13.10にデフォルトで入っているtmux 1.8で検証しています。

tmuxの構造

tmuxはクライアント、サーバ対話型で、基本的にtmux内で起動したシェルやプログラムは全てサーバプロセスの下にぶら下がって動作します。

(1サーバプロセスがあったとしたら、nクライアントが接続する形です。)

サーバプロセスの方でシェルやプログラムを立ち上げる仕組みのおかげで、デタッチしてサーバからログアウトしても、ずっと実行したシェルやプログラムが残るわけですね。

プロセスツリーはこんな感じ:

root@ubuntuserver:~# pstree  -Ap
init(1)-+
        |
        |
        |-sshd(897)-+-sshd(1352)---sshd(1399)---bash(1400)---sudo(1486)---su(1487)---bash(1488)---tmux(2090) ← tmuxクライアント1号
        |           `-sshd(2407)---bash(2494)---tmux(2593) ← tmuxクライアント2号
        |
        |
        |-tmux(2092)-+-bash(2093)---pstree(2594) ← クライアント1号2号の繋ぎ先tmuxサーバとその一味
        |            |-bash(2254)
        |            `-bash(2303)
        |

サーバ⇔クライアント間の対話はUnixソケットで行われ、実ファイルは/tmp/tmux-0/defaultとかで見つかると思います。

C-b(Ctrl+B) がデフォルトのprefixキーなのはどう考えてもおかしい

http://sourceforge.net/p/tmux/tmux-code/ci/master/tree/FAQ

  • Why is C-b the prefix key? How do I change it?

The default key is C-b because the prototype of tmux was originally developed inside screen and C-b was chosen not to clash with the screen meta key.

初期のtmuxの開発環境との兼ね合いで適当にふられているだけっぽいですね。これといった合理的な根拠はないみたいです。

もちろんEmacsでもviでもbashでもC-bが封印されていたら私はイラつくので、C-tにします。

(~/.tmux.confファイル)

unbind C-b
set -g prefix C-t
bind C-t send-prefix

でも、これじゃあEmacsbashのtranspose characters(カーソル前後の文字入れ替え)が封じられて残念なことになるじゃないか、と思う人もいると思いますが、C-tを2連打すれば元通りC-tが送ることができるのでギリギリ妥協できませんかね。

tmux上で256色にならない

たぶんデフォルトのtmux上で下記のコマンドを実行した場合、色が死んだスライムが表示されるかと思います。 (Linux - motd に Dragon Quest のキャラクターのドット絵を表示させる - Qiita

(tmux上) #> curl https://gist.githubusercontent.com/makocchi-git/9775443/raw/746887fbc6e1a7c6b120af0abcfe58701e8b4550/slime-allstar.txt

256色カラーがtmuxで無効になっているのが原因で、ネットだと~/.tmux.confに何かオプション足せば直る的な記述が多いですが、私の環境だとそれを追加しても直らなかったです。

そういう場合は、下記のようにして$TERM変数直して起動するとちゃんと256色出ると思います。 (tmuxがTERM変数見て256色有効にするか判定してます)

#> TERM=xterm-256color tmux
(tmux上) #> curl https://gist.githubusercontent.com/makocchi-git/9775443/raw/746887fbc6e1a7c6b120af0abcfe58701e8b4550/slime-allstar.txt
→ ちゃんとカラフルなスライムが表示される

$TERM変数の書き換えについては~/.bashrcで書き換えるなり、tmuxにTERM=xterm-256color tmuxエイリアス貼るなりで対処すればOKだと思います。

tmuxで合わせ鏡やったらどうなるの?

答. 画面が0サイズまで縮む。

リモートデスクトップとかで合わせ鏡(自分を映す画面を映す自分を映す画面を映す…)やったことがある人は多いと思いますが、tmuxでも下記でできます。

#> tmux
(tmux上) #> TMUX= tmux attach

  以後, ...に画面を埋め尽くされる

自分が自分につないでいる構造ですね。

TMUX=はTMUXという変数に値があるとtmuxがネスト起動を許してくれないので、変数の中身を消去してからネスト起動をしています。

変数消去をやらないでネストさせたい場合は、tmux内で自分にssh接続してtmux attachしてもいいでしょう。

ネストされた側はステータスバー分表示領域が減るので、その減った表示領域にあわせてネスト親側も表示領域が減り、その減量に合わせてまたネストされた側のステータスバー表示領域も減り、というトランポリンで画面領域がなくなるのだと思われます。

まとめ

tmuxは便利。tmuxを使うとTeratermのウィンドウが劇的に減る!

tmuxを使わないのは損だと思います。

私みたいに乗り遅れちゃった人も使おう。

最初はキーとか覚えるのが大変なので、なんかチートシート探して印刷しておいておいてもいいかもしれませんね。

コピーモードとかもちょっとややこしいので、最初はふれなくていいと思います。

最初は以下覚えておけば、どうにかなるかな。

#> tmux          新規tmuxセッション開始
#> tmux attach   既存tmuxセッションに接続(Attach)

prefix 0-9   N番目のウィンドウに切り替え
prefix c     ウィンドウ作成
prefix x     ペイン削除
prefix d     セッションの切断(Detach)

コピペモードや時計モードとかの特殊モードに入ったらqで出られる