🖥️

雰囲気で理解する tmux(ターミナルマルチプレクサ)

に公開

https://qiita.com/advent-calendar/2025/miraito-inc

はじめに

AIによる並列開発を行う際に Git Worktreeとtmuxの組み合わせがよく利用されます。

これらをどう組み合わせて並列開発を行うのかを知るために、まずは個々のツールについて深堀りしようということで前回は Git Worktree について解説しました。

雰囲気で理解する Git Worktree

そして今回はtmuxについて深堀りしていきます。
※厳密にはターミナルマルチプレクサについて

ゴールとしては tmux がどのような局面で役立つのかをイメージ出来ることをしているため、コマンドの話はここではしません。

tmuxの基本操作は世の中にたくさんあるため、触れないことにしました。
※ 次回の記事で軽く説明する予定

tmuxとは

まずtmuxとはTerminal Multiplexer(ターミナル多重化装置)という仕組みを実現するための具体的なツールの事です。

※以降はTerminal Multiplexerの事はターミナルマルチプレクサと呼びます

ターミナルマルチプレクサとは、一つのターミナルウィンドウ(またはセッション)内で複数の仮想的な端末セッションを管理・多重化するためのアプリケーションソフトウェアです。

主なソフトウェアとしては、tmux(ティーマックス)やGNU Screen(スクリーン)などが有名です。

ターミナルマルチプレクサの基本機能・仕組み

ツールによって細かい機能は異なりますが、ターミナルマルチプレクサというものは次のような機能を添えています。

  1. セッションの永続化
  2. 画面分割とウィンドウ管理
  3. セッション共有

1. セッションの永続化

セッションの永続化は、ターミナルマルチプレクサといえばこれでしょ!といわんばかりの機能です。

実行中のプロセスを物理的な接続から切り離し、サーバー上で生かし続ける仕組みです。

永続化の単位となるのが「セッション (Session)」です。

セッションとは、サーバー上で独立して稼働し続ける仮想的な作業空間のまとまりです。

SSH接続が切れても、このセッション自体はサーバーのバックグラウンドで生き続けます。


セッションの永続化のイメージ

detach と attach という操作を上手く使ってセッションの永続化を行います。

detach
現在接続しているクライアント(あなたのPCのターミナル)から、マルチプレクサセッションを切り離す操作です。

SSH接続が切れても、サーバーのメモリ上ではセッションと、その中で実行されているすべてのプロセス(例: バッチ処理や webpackのwatch など)が動作を継続します。

SSHの接続が切れることを気にせず、長時間かかるジョブや、継続的に動いていなければならない開発サーバーを実行し続けることができます。

attach
バックグラウンドで永続化されているセッションに、新しいクライアントから再度接続し直す操作です。

デタッチした瞬間の画面の状態(画面分割、実行中のログ、コマンド履歴など)が完全に復元されます。

接続が切れたり、自宅から会社へ移動したりしても、それまでの状態を簡単に復元出来るようになります。

セッションの永続化の有無による違い

永続化なしの場合 (通常のSSH) 永続化ありの場合 (tmux/Screen)
デプロイの長時間ジョブ 本番サーバーでのDBマイグレーションや大規模なアセットビルド中に、Wi-Fiが切れてプロセスが強制終了し、デプロイが中途半端な状態で失敗する。 処理開始直後にデタッチ。接続が切れてもサーバー側でジョブは完走。後で再アタッチして結果を確認できる。
リモート開発の維持 リモート環境で起動したnpm run devが、PCのスリープやSSHタイムアウトで落ちてしまい、再起動が必要になる。 サーバーを起動したらデタッチし、サーバーは常時稼働。PCを閉じてもサーバーは落ちず、翌朝すぐに再アタッチして作業を再開できる。

2. 画面分割とウィンドウ管理

一つの永続化された「セッション」の中に、さらに「ウィンドウ」と「ペイン」 という階層的な作業空間を作り出すことで、ターミナル作業を多重化することが出来ます。


こんな感じで各セッションの中に更に仮想空間を作ることが出来る

ウィンドウ (Window)
ウィンドウは、ターミナルの世界における「タブ」のようなものです。

これは、互いに独立した仮想的なワークスペースを提供し、開発における大きなタスクやプロジェクトのカテゴリごとに切り替えて使用します。

またこのウインドウには名前をつけることも出来ます。


ウィンドウに名前をつけた例

これにより、例えば「フロントエンドのバグ修正」から「デプロイ設定の確認」に切り替えるとき、コンテキストの切り替えが瞬時にできるので、今何してるだっけ?とならないようになります。

概念としては部分的にGit Worktreeと似ている気もしますね。

ペイン (Pane)
ペインは、一つのウィンドウをさらに細かく分割したものです。

これにより、関連性の高い複数のプロセスを同時に監視し、操作することができます。

ウインドウという作業スペースの中で更に細かい単位で画面を作業画面を作れるみたいなイメージぐらいで良いかなと


ペインで画面を分割した例

3. セッション共有

セッション共有は、永続化されている一つのセッションに対して、複数のクライアント(ユーザーまたは端末)が同時に接続し、同じ画面を共有するといった事が出来るようになります。

単に画面を見るだけでなく、接続している全員がそのターミナルを操作できるのが特徴です。

自分の業務内容的にはあまりこの機能を使う場面があまり思い当たらず・・・

git worktree × tmuxの組み合わせがなぜ良いのか

先程のセクションではターミナルマルチプレクサの機能について話しました。

いよいよ本題である並列開発において、ターミナルマルチプレクサの機能がどう役立つのかを見ていきましょう。

ポイントは、その機能によって複数の作業コンテキストを同時に保持できることです。

git worktree で複数のブランチを同時にチェックアウトできるので、tmux でそれぞれに対応したセッションを作り、管理します。

例えば次のように、git worktree で複数ブランチを切ったとします。それぞれのブランチに対して tmux でセッションを切ります。

/project/main   → tmux セッション: main
/project/auth  → tmux セッション: auth
/project/api  → tmux セッション: api

これにより、各ブランチごとに独立した作業スペースを持てるため、コンテキストを切り替えながら並列して開発が出来るようになります。

イメージとしては、ブランチごとに「専用の開発環境タブ」が常時立ち上がっていて、そこに戻ればすぐに作業の続きができる状態ですね。

なぜ Worktree ごとにセッションを分ける必要があるのか?

例えば、auth ブランチの作業中に Web サーバー(php artisan servenpm run dev)を起動し、同時に api ブランチの作業を開始したいとします。

1つのターミナルウィンドウだけでこれをやろうとすると、次のような問題が起きがちです。

  • サーバーを起動したシェルをそのまま占有してしまう
  • 同じウィンドウ内で複数プロセスを動かすと、ログや出力が混ざって視認性が落ちる

tmux で独立したセッションに分けておけば、次のようにできます。

  • 各 Worktree 内で、それぞれ別の Web サーバーや開発サーバーを起動したままにしておく
  • 各 Worktreeごとにログ、テスト実行、Git 操作などを分離して並行実行する
  • セッションを切り替えるだけで、ブランチごとの「環境と状態」にすぐ戻れる

結果として、「コードのブランチ(Worktree)」と「実行中の開発環境(tmux セッション)」が 1 対 1 で対応するので、並列開発の管理がかなり楽になります。

まとめ

今回は、tmux というターミナルマルチプレクサの仕組みと、その代表的な機能(セッションの永続化、画面分割、セッション共有)をざっくり押さえたうえで、git worktree と組み合わせると何がうれしいのかを見てきました。

ポイントを整理すると、次のようになります。

  • ターミナルマルチプレクサは「セッション」という単位で作業環境を丸ごと保持できる
  • 1つのセッションの中に、ウィンドウやペインを作ってタスクごと・役割ごとに画面を分けられる
  • detach / attach によって、SSH が切れてもサーバー側でプロセスを生かしたまま作業を再開できる
  • セッション共有を使えば、同じターミナル画面を複数人で見たり、一緒に操作したりできる
  • git worktree でブランチごとにディレクトリを分け、tmux セッションを 1 対 1 で対応させることで、
    • 各ブランチ専用のサーバーやログを立ち上げたまま保持できる
    • ブランチごとのテスト・デバッグ・Git 操作を混ぜずに並列で回せる
    • セッションを切り替えるだけで、そのブランチの「作業の続き」にすぐ戻れる

結果として、「コード上の分岐(ブランチ / Worktree)」と「実行中の開発環境(tmux セッション)」を対応付けて管理できるようになり、生成AIを含む並列開発の手間を削減できることがわかりました。

次回の記事では、実際にworktree を切るところから tmux セッションを貼るまでの具体的なコマンド例やブランチ名から自動で tmux セッションを作る

といった、もう少し実務寄りの話をしていこうと思います。

補足

この記事ではtmuxを例に挙げて解説を進めてきましたが、Git Worktreeによる並列開発を実現するために必要なのは、「ターミナルマルチプレクサが持つ基本機能」 そのものです。

この記事を最後まで読んでくださった方であれば、tmux を使う本質的なものが何かまでイメージして頂けたのではないでしょうか。

ここまで理解するのに時間はかかりましたが、概念から理解するのは楽しかったです!

有名どころのツール
ウィンドウ管理とセッション管理の両方が出来るもの

最後に

次回は @FrozenVoice
による 2025年買って良かった物 になります。

FrozenVoice さんはガジェット好きで色々買ってるので、どんなものが気に入ったのか気になってますw

去年も書いてるので良ければ
https://qiita.com/FrozenVoice/items/2852a9333c73959f4145

Discussion