とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど
読者登録と各種SNSのフォローもよろしくお願いいたします。

tmuxだけじゃない、Terminal Multiplexer

Terminal Multiplexerというと、GNU Screenやtmux、それらを強化するByobuが有名です。私もtmuxには大変お世話になっております。これらのツールはセッション管理などの目的で、リモートの接続先で起動しなくては意味がないと思うのですが、画面分割などのウィンドウ管理はローカルで使いたいことがよくあります。そこで、セッション管理とウィンドウ管理、それぞれの機能だけを備えたツールを紹介します。

ウィンドウ管理

tmuxでいうところのペイン(画面分割)の追加やウィンドウ(タブ)の追加のことです。

dvtm

github.com

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

github.com

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

github.com

dvtmと同じエンジニアが公開しています。

www.brain-dump.org

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

github.com

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