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で生存確認する処理を書くくらいなら、セッション管理ツールを組み込んでみてもいいかもしれません。
