読者です 読者をやめる 読者になる 読者になる

理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

便利。tmuxサーバを終了させてもセッションを復元できる tmux-resurrect

technology environment

ぼくは、もっぱら tmux を家の Mac でだけ使っているんですけど、そういうときにクソダルいな〜〜と思っていたのが、tmux のセッションが OS の再起動によって失われるということでした。
tmux のウィンドウやペーンを "良い感じ" なレイアウトにしていたとしても、tmux を立ち上げているターミナルを落とす、あるいは OS そのものを落とすといったことを行ってしまうと、そういった tmux のセッション情報は永久に失われてしまって、次回起動時に泣きながら再設定しないといけない。
でももうそんなゴミみたいな作業からはおさらばだ! tmux-resurrect でもう何もかも自由だ!!!!

tmux-resurrect とは

tmux-resurrect が提供する機能は大きく 2 つです

  1. tmux のウィンドウ、ペーン、(一部の)プロセスをローカルに保存する
  2. 保存した情報を、tmux の上で復元する

すばらしい!!!!!
なお、「プロセスの保存」ということで、プロセスの内部状態まで保存してくれるのではないか、と期待は膨らみますが、さすがにそんなことはしてくれません。無理を言うな。
このプラグインがしてくれるのは、ps コマンドで取れるレベルの起動コマンドを再実行してくれる程度だから、「プロセス状態をシリアライズしてくれる夢の tmux plugin!!!!」とか夢見がちなことはやめましょう。

インストール

インストールするためには、tpm (Tmux Plugin Manager) を使う方法と github からチェックアウトして直接インストールする方法があるんだけど、tpm が便利だったのでここでは tpm を使う方法を紹介します。

1. tpm のインストール

tpm は、Tmux をプラグインとして設定していこうという思想の元、そのプラグインを管理する Manager として開発されたものです。たぶん。tmux 1.9 が必要だから、まだ 1.8 を使っているヤツは速攻で update しろ。
インストール方法は tmux-plugins/tpm · GitHub に書いてある通りではあるんですが、簡単に言っておくと、

(1) tpm をチェックアウトしましょう。

$ git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm

なお、これは補足ですが、$HOME/.tmux/plugins/tpm という場所を変更したい場合は、tmux の中で一々 TMUX_PLUGIN_MANAGER_PATH を変更する必要があるからお勧めしない。詳しく知りたい人は set_tpm_path.sh を見ましょう。


(2) .tmux.conf に以下を記述しましょう。

set -g @tpm_plugins '              \
  tmux-plugins/tpm                 \
'
run-shell '~/.tmux/plugins/tpm/tpm'

@tpm_plugins には、使いたいプラグインを羅列します。ここでは tpm だけを指定しています。
その後、run-shell コマンド経由で tpm を実行する、という流れになります。この tpm の実行によって、ダウンロード済のプラグインが読み込まれたりするんだ。

(3) 新規に設定したプラグインをインストールしましょう。

tmux の Prefix キー + 'I' を入力したら、勝手に github からプラグインをインストールしてきてくれます。便利ですね。これでプラグインが使えるようになりました。

2. プラグインとして tmux resurrect を使えるようにする

(1) tmux.conf 上で tmux-resurrect を使えるようにしましょう

1-(2) で書いている @tpm_plugins に、tmux-resurrect を記述します。まぁ、1-(2) の段階で書いてても良かったんだけどな。

set -g @tpm_plugins '              \
  tmux-plugins/tpm                 \
  tmux-plugins/tmux-resurrect      \  # ここ追加した
'

この後、tmux 上で prefix + 'I' を押下することで、tmux-resurrect がインストールされます。

使ってみましょう

さっきこんなことを書きましたが、

tmux-resurrect が提供する機能は大きく 2 つ。

  1. tmux のウィンドウ、ペーン、(一部の)プロセスをローカルに保存する
  2. 保存した情報を、tmux の上で復元する

初期のキーバインドでは、保存は prefix + Ctrl-s、復元は prefix + Ctrl-r に設定されています。これを変更したい人は、

set-option -g @resurrect-save 'S'
set-option -g @resurrect-restore 'R'

という形でキーバインドを変更すれば良いです。(define-key ではない)

この保存用キーバインドを実行してやると、tmux のステータスラインに

Tmux environment saved!

と表示されて、tmux のセッションの設定が保存されます。初期設定だと、保存先は ~/.tmux/resurrect/ になります。テキストファイルだから、興味あれば見てみると良いです。
保存先を変更したい人は、.tmux.conf で

set-option -g @resurrect-dir '/some/path'

とかすれば良い。


保存したので、次は復元しましょう。tmux をプロセスごと exit させて、セッションの情報を一切消しましょう。昔であれば、もうこの時点で絶望するしかなかった。しかし今、我々には tmux-resurrect がある。
tmux を起動したら、上記で設定したキーバインド (設定していない人は prefix + Ctrl-r) を押下してみましょう。今度はステータスラインに

Tmux restore complete!

と出て、ほら、復元できましたね!!!!!!!!!!!!!!!!!!

おやおや! できてないんだけど!!

おうおう、復元できていないんだけととか言ってるお前。うん、1 つ目のウィンドウだけ復元されないんだろ。それ FAQ だから注意な。バグじゃねぇから。

というのも、tmux-resurrect の思想として、既に立ち上げた tmux のウィンドウを「上書きしない」ってのがあります。だって、そのウィンドウで、ユーザは何か上書き厳禁な操作をしてるかもしれませんしね。なので、保存済のウィンドウと名前が被るウィンドウには復元を行いません。残念でした。
これを解決する方法として、開発者である bruno- は、ウィンドウには名前をつけようね、と仰っております。

Do all the work in named sessions. That way there won't be anything to restore in the first window of a session named 0. Sessions can be named/renamed with prefix+$.

https://github.com/tmux-plugins/tmux-resurrect/wiki/Help:-issues-with-the-first-window

他のウィンドウはちゃんと復元できてるだろ。よかったな。便利だな。

まとめ

というわけで、たいへんに便利な tmux-resurrect であるからして、みなさんガンガン導入しましょう。
個人的には、tmux 終了時に自動で保存できるようにしたいー。