Raspberry Piなどで使えるターミナル・マルチプレクサ「tmux / screen」超入門

---

この記事では、Raspberry Piのようなリモート環境で開発・運用をする際に便利な **tmux** や **screen** といった「ターミナル・マルチプレクサ」ツールについて、初心者の方向けに分かりやすく解説します。  

## **目次**
1. [なぜ tmux / screen を使うのか](#なぜ-tmux--screen-を使うのか)  
2. [インストール方法](#インストール方法)  
3. [tmux の基本的な使い方](#tmux-の基本的な使い方)  
4. [screen の基本的な使い方](#screen-の基本的な使い方)  
5. [実行例: SSHで長時間プログラムを回す](#実行例-sshで長時間プログラムを回す)  
6. [新しいセッションをどこで開始すればいいの？ (SSH or VS Code)](#新しいセッションをどこで開始すればいいの-ssh-or-vs-code)  
7. [tmux と screen、どちらを使うのがおすすめか？](#tmux-と-screenどちらを使うのがおすすめか)  
8. [よくある質問 (FAQ)](#よくある質問-faq)  
9. [まとめ](#まとめ)

---

## **1. なぜ tmux / screen を使うのか**

### **1.1. SSH切断時でもプログラムが継続**
通常、SSHでリモートにログインしてプログラムを実行すると、ネットワークが切断したりターミナルを閉じたりすると実行中のプログラムが終了してしまいます。  
**tmux** や **screen** は、**仮想ターミナルセッション**を作ることで、SSH接続が切れてもプログラムを継続させられます。  
- **長時間実行のタスク**を走らせる際に特に便利です。

### **1.2. 複数ウィンドウや画面分割を活用**
- 1つのターミナルを複数に分割し、同時に複数の作業（ログ監視、コマンド実行など）を行えます。  
- ウィンドウを増やして、ターミナル間を簡単に切り替えられます。  
- 作業効率の大幅アップに繋がるため、リモート開発では定番ツールです。

### **1.3. 遠隔コラボレーション（応用）**
tmux/screenセッションを複数ユーザーが共有すれば、遠隔で同じ画面を見ながらペアプログラミングやサポートを行うことができます。

---

## **2. インストール方法**

### **Raspberry Pi OS / Debian / Ubuntu系の場合**
```bash
sudo apt update
sudo apt install -y tmux
sudo apt install -y screen
```

> **ヒント**  
> - **tmux** : 比較的新しい機能が多く、拡張やカスタマイズがしやすい  
> - **screen** : 伝統的なツールで、多くのサーバーにプリインストールされていることがある  

---

## **3. tmux の基本的な使い方**

以下では **tmux** を例に解説します。（screen も同様の概念です）

### **3.1. 新しいセッションを開始**
```bash
tmux new -s my_session
```
- `my_session` は任意の名前です。

### **3.2. セッションを離脱（デタッチ）**
- `Ctrl + b` → `d`  
  - デフォルトで `Ctrl + b` が「プレフィックスキー」。  
  - 離脱してもプログラムは動き続けます。

### **3.3. セッションに再接続（アタッチ）**
```bash
tmux attach -t my_session
```
- 離脱したセッションに再接続して、作業状態を復元できます。

### **3.4. セッション一覧表示**
```bash
tmux ls
```
- 実行中のtmuxセッションが一覧されます。

### **3.5. 代表的な操作一覧 (tmux)**

| 操作                             | キー操作 / コマンド                | 説明                                       |
|:--------------------------------|:----------------------------------|:------------------------------------------|
| 新規セッション作成               | `tmux new -s <名前>`               | 新しいセッションを開始                    |
| セッション一覧表示               | `tmux ls`                          | 実行中のセッションをリスト                |
| セッションに再接続 (アタッチ)     | `tmux attach -t <名前>`            | 指定セッションにアタッチ                  |
| 離脱 (デタッチ)                  | `Ctrl + b` → `d`                   | セッションを残したまま抜ける             |
| 新しいウィンドウ作成             | `Ctrl + b` → `c`                   | ターミナルを新規ウィンドウとして追加       |
| ウィンドウ切り替え               | `Ctrl + b` → `n` / `p`             | 次 / 前のウィンドウへ移動                |
| ウィンドウ分割（上下）           | `Ctrl + b` → `"` (ダブルクォート)   | 水平方向に分割                            |
| ウィンドウ分割（左右）           | `Ctrl + b` → `%`                   | 垂直方向に分割                            |
| ペイン間移動                     | `Ctrl + b` → 矢印キー              | 分割されたペインを移動                    |
| tmuxの終了                       | `exit` / `Ctrl + d`                | セッション内を終了                        |

---

## **4. screen の基本的な使い方**

screen も tmux と同様、「セッション → デタッチ → アタッチ」で操作できます。

### **4.1. 新しいセッションを作成**
```bash
screen -S my_screen
```

### **4.2. セッションを離脱（デタッチ）**
- `Ctrl + a` → `d`  
  - `Ctrl + a` が「プレフィックスキー」として働きます。

### **4.3. セッションに再接続（アタッチ）**
```bash
screen -r my_screen
```
- 離脱した `my_screen` に復帰できます。

### **4.4. セッション一覧の確認**
```bash
screen -ls
```

### **4.5. 代表的な操作一覧 (screen)**

| 操作                           | キー操作 / コマンド          | 説明                                        |
|:------------------------------|:----------------------------|:-------------------------------------------|
| 新規セッション作成            | `screen -S <名前>`          | 新しいセッションを開始                     |
| セッション一覧表示            | `screen -ls`                | 実行中のセッションをリスト                 |
| セッションに接続 (アタッチ)   | `screen -r <名前>`          | 指定セッションにアタッチ                   |
| 離脱 (デタッチ)               | `Ctrl + a` → `d`            | セッションを残したまま抜ける              |
| ウィンドウ作成                | `Ctrl + a` → `c`            | 新規ウィンドウを追加                       |
| ウィンドウ切り替え            | `Ctrl + a` → `n` / `p`      | 次 / 前のウィンドウへ移動                 |
| 画面分割 (上下)               | `Ctrl + a` → `S` (大文字S)  | 水平方向に画面を分割                       |
| 画面分割 (左右)               | `Ctrl + a` → `\|` (環境依存)| 垂直方向に分割                             |
| ペイン間移動                   | `Ctrl + a` → `Tab`          | 分割した画面を切り替え                     |
| screenの終了                  | `exit` / `Ctrl + d`         | セッションを終了                           |

---

## **5. 実行例: SSHで長時間プログラムを回す**

1. **新規セッションでプログラム開始**  
   ```bash
   tmux new -s long_run
   ```
   または  
   ```bash
   screen -S long_run
   ```
2. **プログラムを起動**  
   ```bash
   python3 my_long_task.py
   ```
3. **セッションを離脱（デタッチ）**  
   - tmux → `Ctrl + b` → `d`  
   - screen → `Ctrl + a` → `d`
4. **SSHを切断**  
   - セッション内で起動したプログラムは継続実行されます！
5. **後で再接続（アタッチ）**  
   ```bash
   tmux attach -t long_run
   ```
   または
   ```bash
   screen -r long_run
   ```
   - 作業状態をそのまま復元できます。

---

## **6. 新しいセッションをどこで開始すればいいの？ (SSH or VS Code)**

**結論: どちらでもOK** です。  
- **VS Code上のリモートターミナル**: VS Codeの「Remote-SSH」拡張機能などでログインし、そのターミナルで `tmux new` / `screen -S` を使います。VS Codeを閉じてもセッションは消えません。  
- **ローカルPCのターミナル**: いつものSSHクライアント(PowerShell, macOSターミナルなど)でログインし、同様にコマンドを実行します。

---

## **7. tmux と screen、どちらを使うのがおすすめか？**

### **7.1. tmuxの特徴**
- **新しめの機能や拡張、見やすさ** を重視するなら tmux  
- プラグイン管理ツールやステータスバーのカスタマイズなどが豊富  
- 近年のコミュニティが活発で、情報が多い

### **7.2. screenの特徴**
- **歴史が古く、多くのサーバーにプリインストール** されている場合もある  
- シンプルで軽量だが、画面分割などの操作はやや独特  
- レガシー環境で重宝される

### **7.3. 結論**
- **新規で覚えるなら tmux** を勧める声が多い  
- **既存環境がscreen主体なら無理に乗り換える必要なし**  
- どちらも「SSH切断でもプログラムが続く」「画面分割ができる」という基本機能は共通です

---

## **8. よくある質問 (FAQ)**

### **Q1. tmux / screenを使っているのにプログラムが止まってしまう…**
- **A1**: 何らかの原因でセッション自体が終了している可能性があります。  
  - 例: Raspberry Piが再起動した、セッション内で `exit` コマンドを打ってしまった 等。  
  - `tmux ls` や `screen -ls` でセッションが生きているか確認しましょう。

### **Q2. tmuxのキー操作(`Ctrl + b`)が慣れません…**
- **A2**: `~/.tmux.conf` で `set -g prefix C-a` のように **プレフィックスキーを変更** できます。  
  - screen との操作感を揃えたい場合も、この方法で簡単に設定可能です。

### **Q3. 画面分割したペインのサイズを変更できますか？**
- **A3**:  
  - tmux: `Ctrl + b` → `:resize-pane -D 5` などのコマンドや、Shift + 矢印キーで簡単にサイズ変更できるカスタマイズも可能。  
  - screen: `Ctrl + a` → `:resize` と入力し数値を入れる、等の方法があります。

### **Q4. VS Codeのターミナルでtmuxを使ってデバッグはできますか？**
- **A4**: デバッグ自体はVS Code上のデバッガ機能を使う場合と、tmux内で実行する場合とで操作が別々になることがあります。  
  - Pythonなどは `debugpy` でリモートアタッチすると、tmux上のプログラムもVS Codeでデバッグ可能になるケースがあります。

### **Q5. 同じtmuxセッションに複数ユーザーが入るにはどうすればいい？**
- **A5**:  
  - 同じユーザーアカウントでログインした上で `tmux attach -t セッション名` を使うか、tmuxソケットやACLの設定で複数ユーザーから同じセッションを見られるようにします。  
  - セキュリティ的にはユーザーやグループ管理が関わるので運用設計には注意してください。

### **Q6. tmux / screen を終了させたい時は？**
- **A6**:  
  - tmux / screen 内で `exit` or `Ctrl + d` をすると、そのセッションが終了します。  
  - なお、単に**離脱**（デタッチ）したいだけなら、tmuxは `Ctrl + b → d`、screenは `Ctrl + a → d` です。

---

## **9. まとめ**

- **tmux / screen** は「SSH切断時にプログラムを止めたくない」「画面分割で作業したい」といったニーズに応える**必須級のツール**です。  
- **基本操作**: 「新規セッション → 離脱(デタッチ) → 再接続(アタッチ)」だけでも大半の用途をカバーします。  
- **使う場所**: VS CodeリモートターミナルでもローカルSSHでもOK。環境に合わせて選びましょう。  
- **tmux vs screen**: 新機能や拡張性重視ならtmux、レガシー環境やプリインストール重視ならscreen。  
- **よくあるトラブル**: セッション自体が終了していないか、サイズ変更やプレフィックスキー設定などを再確認して解決を図りましょう。

Raspberry Piなどリソースが限られた環境でも、tmux / screen は軽量かつ強力なツールです。ぜひマスターして、リモート開発・運用を快適に行いましょう！

---

以上