Terminal Multiplexerというと、GNU Screenやtmux、それらを強化するByobuが有名です。私もtmuxには大変お世話になっております。これらのツールはセッション管理などの目的で、リモートの接続先で起動しなくては意味がないと思うのですが、画面分割などのウィンドウ管理はローカルで使いたいことがよくあります。そこで、セッション管理とウィンドウ管理、それぞれの機能だけを備えたツールを紹介します。
ウィンドウ管理
tmuxでいうところのペイン(画面分割)の追加やウィンドウ(タブ)の追加のことです。
dvtm
dwmなどのタイル型ウィンドウマネージャーのコンソール版のようなツールです。Linuxで動作します。たぶんMacでもビルドできますが、追加でライブラリのインストールや、ビルドオプションの変更が必要になる気がします。私は、config.mkの修正と、ncurseswのインストールまで見えて諦めました。Windowsは試していません。
WSL2のUbuntu 22.04環境で試します。
$ sudo apt update $ sudo apt install dvtm $ dvtm -v dvtm-0.15+40.g311a8c0-1build1 © 2007-2016 Marc André Tanner
インストール完了です。
詳細な使い方はmanを見てもらうとして、簡単に説明するとdvtm
コマンドを実行すると、dvtmが開始されます。特に何も設定されていない状態ではctrl+g
がModキーに設定されています。Modキーは、tmuxのprefix相当です。Modキーをタイプしてから何からのキーをタイプすると、そのキーの割り当てられたコマンドが実行されます。
dvtmを実行している画面です。
上にある1から9の数字はタグです。dvtmには1から9で表されたタグという概念があり、タグごとにウィンドウを構成していきます。tmuxのウィンドウやタブなんかを想像してもらうといいと思います。
左の画面がマスターエリアと呼ばれ、新しく追加されたウィンドウが表示されます。ウィンドウが新しく追加されると、古いウィンドウは右側にスタックされていきます。マスターエリアはデフォルトでは1つですが、Mod-iをタイプするとマスターエリアの数を増加、Mod-dで減少できます。古いウィンドウにフォーカスしMod-Enterをタイプすることでマスターエリアにカレントウィンドウを移動できます。
よく使うキーバインドを紹介します。
キーバインド | 動作 |
---|---|
Mod-c | 新しいウィンドウを追加 |
Mod-C | カレントディレクトリに新しいウィンドウを追加 |
Mod-x-x | フォーカスされたウィンドウを閉じる |
Mod-l | マスターエリアを拡大 |
Mod-h | マスターエリアを縮小 |
Mod-i | マスターエリアの数を増加 |
Mod-d | マスターエリアの数を減少 |
Mod-j | 次のウィンドウにフォーカスを移す |
Mod-k | 前のウィンドウにフォーカスを移す |
Mod-J | 下にあるウィンドウにフォーカスを移す |
Mod-K | 上にあるウィンドウにフォーカスを移す |
Mod-H | 右にあるウィンドウにフォーカスを移す |
Mod-L | 左にあるウィンドウにフォーカスを移す |
Mod-Enter | カレントウィンドウをマスターエリアに移動 |
Mod-[1-9] | タグを選択 |
Mod-0 | 全てのタグにあるウィンドウを表示 |
Mod-q-q | dvtmを閉じる |
mtm
mtmもdvtm同様ウィンドウ管理ツールですが、dvtmよりシンプルです。Linuxでも動作しますが、Ubuntuではパッケージマネージャーにありませんでした。Arch LinuxだとAUR(ユーザーリポジトリ)にはありましたが、オフィシャルのリポジトリにはありませんでした。Homebrewだと存在するようなので、今回はMacで試します。
$ brew install mtm $ brew info mtm ==> mtm: stable 1.2.1 (bottled), HEAD Micro terminal multiplexer https://github.com/deadpixi/mtm Installed /opt/homebrew/Cellar/mtm/1.2.1 (6 files, 120.8KB) * Poured from bottle using the formulae.brew.sh API on 2024-09-17 at 20:46:08 From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/m/mtm.rb License: GPL-3.0-or-later ==> Dependencies Required: ncurses ✔ ==> Options --HEAD Install HEAD version ==> Analytics install: 2 (30 days), 6 (90 days), 100 (365 days) install-on-request: 2 (30 days), 6 (90 days), 100 (365 days) build-error: 0 (30 days)
mtmにはバージョンを表示する機能がないので、brew infoの結果を表示しています。
こちらもdvtm同様、詳細はmanを見てもらうとして、簡単に説明するとmtm
コマンドを実行することでmtmが開始されます。Prefixキーは何も設定していない場合ctrl-g
です。
dvtmより機能は少ないです。Prefix-h(horizontal)で上下に分割、Prefix-v(vertical)で左右に分割します。Prefix-Up/Down/Left/Lightでフォーカスを移動し、Prefix-wでウィンドウを閉じます。これだけです。タグやタブが不要な方、機能をあまり使わない方、Macな方、Linuxでどうしても使いたい方はmtmがいいかもしれません。
セッション管理
GNU Screenやtmuxでメインで使いたい機能です。セッションを管理・保持できることで、SSHが急に切れてしまったとしても、実行しているコマンドを確実に完走させられます。また、セッションが残っていれば、このセッションに再度アタッチできるため、結果をロストすることはありません。
abduco
dvtmと同じエンジニアが公開しています。
dvtmとabducoを合わせて使うとGNU Screenやtmuxの代替手段となる、と言っています。
abducoはLinuxやMacで動作します。動作しますが、Ubuntuのリポジトリには入っていなかったため、自前でビルドする必要があります。Arch Linuxではextraパッケージに入っていました。Macの場合はHomebrewからインストールできます。
今回はMacで試します。
$ brew install abduco $ abduco -v abduco-0.6 © 2013-2016 Marc André Tanner
こちらも始め方は簡単です。abduco -c name command
コマンドを実行します。name
はセッション名、command
はabducoで実行したいコマンドです。commandを未指定の場合はdvtmを起動しようとしますが、ただSHELLを起動したい場合は$SHELL
を指定するといいでしょう。
$ abduco -c my-session $SHELL
これで現在起動しているシェルと同様のシェルがabducoの中で起動します。
デタッチする場合はctrl-\
をタイプします。abduco: <session-name>: detached
と表示されてデタッチされます。
アクティブなセッションを確認するにはabduco -l
を実行します。
$ abduco -l Active sessions (on host tanakatomoakinoMac-mini.local) Wed 2024-09-18 10:55:17 my-session
セッションを作成した日時とセッション名が表示されます。
アタッチする場合はabduco -a my-session
を実行します。
コマンドを直でバックグラウンドに起動できます。-n
を指定します。
$ abduco -n test-command bash -c 'sleep 100'
バックグランドでbashを起動し、そこでsleep 100コマンドを実行する例です。リストを見るとtest-command
というセッション名で実行されているのがわかります。
$ abduco -l Active sessions (on host tanakatomoakinoMac-mini.local) Wed 2024-09-18 10:58:35 test-command Wed 2024-09-18 10:55:17 my-session
100秒後にリスト表示すると、先頭に+
がつきました。
$ abduco -l Active sessions (on host tanakatomoakinoMac-mini.local) + Wed 2024-09-18 10:58:35 test-command Wed 2024-09-18 10:55:17 my-session
このコマンドが終了したことを表しています。このセッションにアタッチすることで終了ステータスを見られます。
$ abduco -a test-command abduco: test-command: session terminated with exit status 0
dtach
dtachもabduco同様の使い方です。UbuntuでもMacでもどちらでもパッケージが用意されていました。せっかくなのでWSL2のUbuntu 22.04環境で試してみます。
$ sudo apt update $ sudo apt install dtach $ dtach --version dtach - version 0.9
abducoとdtachの違いは、それほど多くないので、詳細な使い方は割愛します。1つ大きく違う点を説明すると、dtachはセッション名を指定するのではなく、ソケットファイルを指定します。具体的には以下です。
$ dtach -c /path/to/sock-file command
このソケットファイルは物理的に存在します。例えば、/tmp/my-session
というソケットを指定して実行した場合は以下の通りです。
$ dtach -c /tmp/my-session bash $ ls /tmp/my-session srw------- ttanaka ttanaka 0 Sep 18 11:14 my-session $ file /tmp/my-session /tmp/my-session: socket
セッションが終了するとこのファイルは削除されます。dtachにはlistの機能がないので、このソケットファイルは、どこか特定の位置に作成しておくといいかもしれません。
まとめ
私は一時期dwmユーザーだったので、個人的にはdvtmがおすすめですが、ただ分割できればいいんだよねっという方にはmtmでいいかもしれません。こちらの方が操作もシンプルですし。
dvtmがおすすめなのでセッション管理はabducoをおすすめしたいところですが、環境によっては自前でビルドする必要があるかも?ということでdtachでもいいと思います。
ただ、ウィンドウ管理とセッション管理のツール両方を同じ環境で起動するならtmuxなどで十分という説もあるので、遊び半分で使ってみるのがいいのかもしれません。
何らかのツールをシェルスクリプトで作る時に、コマンドを&
でバックグランドに送り込んで、pgrep command
で生存確認する処理を書くくらいなら、セッション管理ツールを組み込んでみてもいいかもしれません。