1画面で複数の端末を操作できるtmux

tmuxは、1画面で複数の端末(ターミナル)を操作できるターミナルマルチプレクサ(terminal multiplexer)と呼ばれるソフトウェアです。

複数のセッションを一つの画面で管理できる、プロセス管理機能を担う一面も持っています。

上の画像では、1画面で3つのターミナルを操作しています。種類の異なるログをリアルタイムで表示するなど、様々な使い道があります。

tmuxは非常に多機能なので、初学者にはとっつきにくいかもしれませんが、テキストエディタで設定ファイルを編集し、すぐに設定を反映させる場合など、複数画面の方が便利な場面が多いので、是非とも学習環境に導入していただきたいです。

https://linuc.spa-miz.com/wp-content/uploads/2020/09/meface.pngミズサワくん

tmuxは、LinuCレベル1の101試験「1.01.4 プロセスの生成、監視、終了」の詳細「ログアウト後にも実行が継続されるようにプログラムにシグナルを送信する。」で重要なコマンドに位置づけられています。試験に出ると言うことだけでなく、本当に便利なコマンドなので普段でも使いこなせるようになりましょう。ちなみにtmuxはLPIC ver.5.0でも試験範囲てす。

tmuxを使うメリット

複数のターミナルを管理するのに便利なtmuxですが、それ以上に使われる理由となっているのがリモートでの作業においてです。

リモートでの作業中に、何らかの理由でホストへの接続が切れてしまった場合、作業が途中で終了してしまったり、大事なデータが保存されなかったり、様々なトラブルが発生する可能性があります。

tmuxはこうした接続が切れた場合でも、作業に復帰できるデタッチ、アタッチ機能があります。普通に、作業途中でデタッチしたとしても、それまでの作業を記憶しており、アタッチ後にすぐに作業に復帰できるのがtmuxの魅力です。

tmuxのインストール

CentOS

# yum install tmux

参考:CentOS8ではパッケージ管理コマンドはyumからdnf推奨に変わりました。yumでも動作します。

# dnf install tmux 

Ubuntu

$ sudo apt install tmux

MacOS(参考)

$ brew install tmux

tmuxの起動と基本的な使い方

tmuxの起動は同名コマンドの入力で行います。続けてサブコマンドを入力することで各種セッション操作が可能です。サブコマンドの詳細については後述します。

$ tmux [サブコマンド]

それでは、早速tmuxを使ってみましょう。ターミナルでtmuxを入力します。

$ tmux

起動後は、プロンプトが表示されコマンド待機状態になっていますが、下に緑色のバーが表示されています。このバーはステータスラインと呼ばれており、ここでtmuxの状態を把握できます。

細かく言うと、tmuxによってセッションが新たに開始され、1つのウインドウが表示されている状態です。

現在はターミナルのプロンプトが表示されていますので、ステータスラインには「0:bash*」と表示されています。最後の「*」はアクティブな状態である事を示しています。

[0] 0:bash*

この状態で、次にtopコマンドを入力してみます。

topはシステムとプロセスの状況を数秒間に1回の割合で継続的に表示し続けるコマンドですので、画面一杯に表示され、qキーで終了させない限りシェル操作はできません。ステータスラインには「0:top*」と表示されています。

[0] 0:top*

topを起動させたまま他の操作をしたい場合にtmuxが活躍してくれます。

tmuxの様々な機能を使いこなすには独自のキー操作が必要になります。

「Ctrl + b」に続けて「c」キーを入力すると、tmuxは新たなセッションを呼び出します。

ステータスラインには、0:topの右隣に「1:bash」が追加されています。

[0] 0:top- 1:bash*

topが動作したまま裏側に映り、表に新たなターミナルが追加されたようなイメージです。

「Ctrl + b」のような独自のキー操作は「プレフィックスキー」と呼ばれており、tmuxではこのプレフィックスキーに続いて任意のキーやオプションを入力することで様々な操作ができます。

標準ではプレフィックスキーに「Ctrl + b」が割り当てられています。なお、Ctrlとbは同時押し、またはCtrlを押したまま追ってbを押しても有効です。

bashの画面からtopに戻りたい場合は、プレフィックスキー「Ctrl + b」に続いて「p」キーを押します。

topからbashに戻りたい場合は、プレフィックスキー「Ctrl + b」に続いて「n」キーを押します。

pは「戻る」を意味するprevious、nは「次」を意味するnextの頭文字です。ちなみに、今回は2つのセッションの行き来なのでpでもnでも同じ動作をします。

さらにプレフィックスキーにcで新規セッションを追加。rootユーザーに切り換えて、tailコマンドで直近のシステムログを表示させてみます。

# tail -f /var/syslog/messages

このように、何か作業をしながらでも、ウインドウを切り換えることで、リアルタイムで更新されるログを瞬時に確認できるのがtmuxの魅力です。

ちなみに、今回のウインドウの切替は、アクティブなウインドウを起点にpとnで前後に移動できますが、ウインドウが増えた場合は、プレフィックスキーに数字が便利です。例えば、tailの画面からtopに切り換える場合はCtrl + bに続いて0を押します。

tmuxで使われる特殊な用語

ここでtmuxでよく使われる特殊な用語を整理してみます。

  • プレフィックスキー:操作のために最初に押すキー
  • セッション:tmuxによって管理される複数端末の集合体
  • ウインドウ:セッションで管理される個別のウインドウ
  • ペイン:ウインドウ内部で分割された領域
  • デタッチ:セッションから切断
  • アタッチ:デタッチしたセッションに再度接続

tmuxでは様々なショートカットキー(プレフィックスキーに続く特定のキー操作)によって、ウインドウやペインを操作することで、目的に応じてターミナルを構成することができます。

セッション管理

セッションはtmuxコマンド入力する度に生成されます。GUI環境下でターミナルを複数立ち上げたりしている場合、それぞれのターミナルでtmuxコマンドを入力するとそれぞれが別のセッションになります。

例えば、上で紹介しているウインドウが一つだけの状態で、新規にターミナルを立ち上げ、tmuxコマンドを入力します。さらにもう一つ新規にターミナルを立ち上げ、tmuxコマンドの後にlsを入力してみましょう。

$ tmux ls

tmux lsで動作しているセッションとウインドウの状態が確認できます。上の例では、セッションが2つあり、1つめのセッションではウインドウが3つ動作していることがわかります。

セッションの状態はtmuxのセッション上からも確認できます。プレフィックスキーの後に「s」キーを入力します。

こちらでも、セッションが2つあり、1つめのセッションではウインドウが3つ動作していることがわかりますね。

さらにカーソルキーを押し、0番のセッションを選択してみましょう。

3つのウインドウの概要も表示され内容が確認しやすくなっています。

ウインドウとペインの管理

tmuxを最も特徴付けているのが1つのウインドウを複数のペインに分ける機能です。

それでは、上の3つのウインドウの内容を新たに1画面に表示させてみましょう。

新規にセッションを開始して、プレフィックスキーに続いて「”」キーを押します。

ウインドウが上下に分割されました。さらに、プレフィックスキーに続いて「%」キーを押します。

アクティブだったウインドウが今度は左右に分割されました。3つに分割されたものそれぞれがペインです。ペインにも番号が振られており、プレフィックスキーに続いて「q」キーで確認できます。

では0のペインにtopを、1のペインにtailを入力してみます。

ちなみに、ペイン間を移動する場合は、プレフィックスキーに続いて「o」を押します。また、プレフィックスキーに続いて上下左右のカーソルキーでも移動が可能です。

当初別々のウインドウで表示していた情報を一つの画面に収めることができました。

このように、複数のペインで構成したウインドウを複数動かしたり、目的に応じてセッションを分けるなど、実に多様な使い方ができるのがtmuxの魅力です。

デタッチとアタッチ

tmuxで設定した状態を維持したまま、tmuxを抜けることも簡単です。これをデタッチと呼んでいます。プレフィックスキーに続いて、「d」キーを押します。

上の例から引き続いてデタッチをするとターミナルに[detached (from session 2)]と表示されています。

また、再びセッションに接続することをアタッチと呼びます。アタッチする場合はtmuxの後にサブコマンド「attach-session」を入力します。サブコマンドは、attach、またはaだけでもいけます。

そして、このデタッチとアタッチ機能がリモート接続時に威力を発揮するわけです。リモートホストにsshログインして、tmuxを動かしていれば、何らかのトラブルで接続が切れてしまっても、アタッチすることで作業に復帰できるというわけです。

tmuxの代表的なサブコマンド

他にもtmuxには様々なサブコマンドが用意されています。

サブコマンド内容
attach(a) [-t n][n番の]セッションにアタッチ(再接続)する
list(ls)セッションをリスト表示する
kill-session [-t n][n番の]セッションを終了する
kill-server全てのセッションを終了する
new-session新しいセッションを作成する

全ては紹介しきれませんので詳細は割愛しますが、興味のある方はこれまでの例を参考に実際に試してみてどのような動作をするかを確認してみてください。

最後に、プレフィックスキーと組み合わせて使う代表的なショートカットキーをまとめておきます。

キーサブコマンド内容
cnew-window新しいウインドウを表示
nnext-window次のウインドウへ移動
pprevious-window前のウインドウへ移動
wchoose-windowウインドウの一覧を表示
数字select-window指定した番号のウインドウへ移動
Ilast-window直前に表示していたウインドウへ移動
&kill-windowアクティブなウインドウを削除
ddettach-clienttmuxをデタッチする
%sprit-window -hウインドウを左右のペインに分割
sprit-windowウインドウを上下のペインに分割
oselect-pane分割したウインドウをペイン順に移動
カーソルselect-pane -U/-D/-L/-R上下左右のペインに移動
schoose-treeセッション一覧をウインドウ情報含めツリー表示
?helpを表示

ショートカットキーは他にもたくさんありますが、上記のキーが一通り使えれば、自分好みのターミナルに仕上げることができるのではないでしょうか。

是非、tmuxを使いこなしてLinuxライフを充実させてください。

LinuCレベル1バージョン10.0でもtmuxコマンドは試験範囲に入っていますので受験する方は要チェックです。

memo
プレフィックスキーはCtrl + bではなく、任意のキーの組合せに変更することもできますが、それについてはまた別の機会に解説します。