tmuxについて

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

# 0. はじめに

SSHはとても便利なリモート接続できるプロトコルですね。これがなければ仕事ができないぐらいになっています。
SSHは接続が切れてしまうとセッションが終了してしまします。それでは継続して作業したい時に困ります。
そこで出てきたのがscreenというコマンドです。screenよりも便利なツールとしてtmuxがあります。

# 1. tmuxとは？

ChatGPTに聞いてみました。

tmuxは「terminal multiplexer」の略称で、複数のターミナルセッションを1つの画面内で同時に操作できるユーティリティプログラムです。プログラマやシステム管理者などがコンソール作業を効率化するために使われます。tmuxを使用すると、次のようなことができます：

- tmuxは1つのターミナル上(SSH接続)で複数の接続を立ち上げて同時並行で作業できるもの
- サーバ側でインストールしていればSSHを通じてクライアント側から利用できる。また、1つのセッションだけでなく複数のセッションを扱えるという特徴がある
- セッションがブチ切りされてもウィンドウは残るので、セッションが切れても再接続できる
- 画面分割機能もある

tmuxはテキストベースのインターフェースを提供し、SSHなどのリモート接続を介してサーバーにアクセスしている際にも非常に便利です。また、ネットワークが切断された場合でもセッションは維持されるため、再接続して作業を続けることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/096d7367-6fed-dc0c-b73e-dac2000c4d86.png)

図は、[tmuxの基本操作と、基本のカスタマイズ。version 3\.2a \| dipolecats TIPs](https://dipolecats.net/tips/642/)から参照

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/895436ef-c60a-6e56-36a9-bac96db0409d.png)

図は、[tmuxを必要最低限で入門して使う \#MacOSX \- Qiita](https://qiita.com/shin-ch13/items/9d207a70ccc8467f7bab)から参照

# 2. tmuxの基本的な使い方

## 2-1. tmuxセッションの開始
tmuxコマンドで開始
```
$ tmux
```

## 2-2. tmuxセッションの終了
tmux内のセッションでexitで終了
```
$ exit
```

## 2-3. セッションの挙動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/d1fe4eec-3fec-bc37-c1c2-81f05fc18c95.png)

セッションは以下のようになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/d2c10cac-3c65-4f16-016d-c3f3dcc4d089.png)

# 3. tmuxセッションを継続させて切り離す

## 3-1. tmuxセッションの開始
tmuxコマンドで開始
```
$ tmux
```

## 3-2. セッションを分離
tmuxのセッションを分離して通常のセッションへ戻り、tmuxのセッションは継続します

```
ctrl+b d
```
ctrlキーを押しながらbを押して、手を離してdを押す

## 3-3. セッションの挙動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/0f551218-4d0b-8300-49b2-86b4a404cf60.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/288fc2b1-4235-a54e-f285-14847af3248e.png)

## 3-4. 切り離されたtmuxセッションへ再接続
tmuxセッションへ再接続開始

```
$ tmux a
```
切り離されたtmuxセッションが表示されます
再接続したセッションは、終了と切り離しを行えます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/ca63e43f-4d6e-72b3-36b8-a1af32081fa9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/95d4d399-388b-032b-dcb5-d2e80a1fd718.png)

# 4. 複数のセッションを利用する
複数のセッションを切り離してそれらを操作する方法です

## 4-1. 切り離したtmuxセッションを表示
切り離されたtmuxセッションが複数ある場合はtmux lsでセッションをリストアップします

```
$ tmux ls
```

## 4-2. 特定のセッションに再接続

セッション1に接続する
```
$ tmux a –t 1
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/4c71f641-a10f-2efd-4426-1b7f8f6864f1.png)

## 4-3. 切り離された特定tmuxセッションを終了

切り離されたtmuxセッションが複数ある場合はtmux lsでセッションをリストアップします
```
$ tmux ls
```

特定のセッションを終了
```
$ tmux kill -t 1
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/069da058-638a-1cb0-8980-565d4f976c83.png)

# 5. tmuxセッションに名前を付ける
tmuxセッションは自動的に連番が付きますが、番号ではわかりにくいのでセッションに名前を付けます。tmuxセッションへの名前の付け方には以下の3種類があります

## 5-1. tmuxセッションを名前付きで開始する
(例)「test-1」という名前でtmuxセッションを起動する
```
$ tmux new –s test-1
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/af30e7d2-0d5e-bfa5-16bf-1a4207a64454.png)

## 5-2. 通常のセッションでtmuxセッションを指定して名前を変更する
(例) セッション「0」を「test-2」へ変更
```
$ tmux rename-session –t 0 test-2
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/d5b98f0d-f70b-3f1d-49f5-fddbfd4dec89.png)

## 5-3. tmuxセッション内で名前を付け替える
セッション内で以下のショートカットキーを叩きます

```
ctrl+b $
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/d9ed255a-6c02-79e8-79db-6772a5dc007c.png)

# 6. tmuxセッションから別のtmuxセッションへ移動
## 6-1. tmuxセッション内で通常セッションへ戻ることなく別のtmuxセッションへ移動する
「test-2」「test-3」のtmuxセッションがあるとする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/96c20960-902e-c937-0265-c52c1555bcfb.png)

どちらのtmuxセッションでもいいので、tmuxセッション内で「ctrl+b s」を叩く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/92c96d7a-2a6b-01d8-1a1b-aa300deb2582.png)

# 7. まとめ

tmuxの使い方でした。