💻

tmux のインストールと初期設定

2023/08/25に公開

tmuxはターミナルをセッションという単位で管理して実行することができるツールである。
機械学習用のLinuxマシンにssh接続して学習などを行う際、通常のssh接続では学習の完了まで接続を維持する必要があり、クライアント側もPCの電源が切れない状態になる。またssh接続が勝手にタイムアウトされてしまう可能性もある。

tmuxは学習を実行してからssh接続を切断しても実行中のセッションはホスト側に残るので引き続き処理は行われる。後は、学習の終了後にセッションに再度接続することで実行結果などを確認することができる。

セッションはホスト側で管理されているのでセッション名さえわかれば、クライアントが変わっても接続可能である。
※ただし、ホストマシンが再起動されるとセッションは全て削除されてしまうので注意。


インストール方法

※以降、Ubuntu 22.04 LTSでの検証を前提とする。

以下のコマンドインストール。

sudo apt install tmux

インストール後はtmuxで起動できる。
なお、この場合はセッション名は自動的に設定される。


セッション・ウィンドウ・ペインとは

tmuxにはセッション・ウィンドウ・ペインという概念が存在する。
以下の図を参照。

セッション・ウィンドウ・ペインの概念


セッションの作成

以下でセッション名を指定してセッションを作成することが出来る。

tmux new -s [セッション名]

タスクに応じてセッション名を変更するのが無難。


セッションの削除

tmux kill-session -t [作成済のセッション名]

全てのセッションを削除したい場合はtmux kill-serverで削除できる。


セッションのアタッチ

tmux aコマンドで直前にアタッチしていたセッションにアタッチすることができる。

セッション名を指定してアタッチしたい場合は以下

tmux a -t [作成済のセッション名]

Prefix

tmuxではprefixと組み合わせることでターミナル上で使用できるショートカットが存在する。
prefixとはtmuxのショートカットを実行するためのトリガーキーと解釈すれば問題ない。
prefixに設定されているキーを入力してから指定のキーを押すことでショートカットを実行できる。
prefixを入力してから次のコマンドを入力するときはprefixを離すこと


コマンドリスト

以下、個人的によく使うコマンド。

コマンド 概要 備考
prefix -> d セッションから抜ける -
prefix -> s セッションの一覧 tmux ls でも可能
prefix -> % ペイン分割(左右) 一つのセッション内でターミナルを上下左右に分割することが出来る。<br>各ペインに対しても分割できるので、4分割以上も可能
prefix -> " ペイン分割(上下) 一つのセッション内でターミナルを上下左右に分割することが出来る。
各ペインに対しても分割できるので、5分割以上も可能
prefix -> o ペイン切替 ペインのインデックス順に切り替わる
prefix -> arrow ペイン切替 任意方向のペインに切り替え
prefix -> q ペイン切替 コマンド入力後に表示される各ペインのインデックスを入力することで任意のペインに移動
prefix -> x ペイン終了 各ペインでexitコマンドを実行でも可能<br>セッション内で実行したコマンドは上記の手順で正しくセッションを終了しないとホスト側にコマンド履歴が残らないので注意すること。
killやPCの再起動などでセッションが削除されるとホスト側のコマンド履歴には残らない。
prefix -> c ウィンドウの作成 作成したウインドウはprefix -> pで次の、prefix -> nで前のウインドウに切り替え
prefix -> , ウィンドウ名の変更 -
prefix -> セッション名の変更 -

~/.tmux.confについて

tmuxはユーザーディレクトリ直下に格納している~/.tmux.conf設定ファイルから設定を読み込んで起動する。

以下自分用のテンプレート(tmux >= 2.9以上を前提に記載)

テンプレート
~/.tmux.conf
# マウスでウィンドウ・ペインの切り替えやリサイズを可能にする
set-option -g mouse on

# 右クリックでのコンテキストメニューの表示機能を無効化
unbind -n MouseDown3Pane

# コピーモードのキー操作をviライクにする
set-window-option -g mode-keys vi

# ウィンドウ履歴の最大行数
set-option -g history-limit 5000

# 新規ウィンドウを同じディレクトリで起動
bind c new-window -c "#{pane_current_path}" 
bind '"' split-window -c "#{pane_current_path}" -v
bind '%' split-window -c "#{pane_current_path}" -h

# ウィンドウの作成・移動・入れ替えのキーバインド 
bind -n S-left prev
bind -n S-right next
bind -n C-S-left swap-window -t -1
bind -n C-S-right swap-window -t +1

# セッション移動のキーバインド 
bind -n S-down switch-client -n
bind -n S-up switch-client -p

# status
set -g pane-border-status bottom
set -g pane-border-format " [#S-#W] pane: #{pane_index} " 

# 非アクティブなペインの色
set -g pane-border-style fg=green
set -g pane-border-style bg="colour235"
# アクティブなペインの色
set -g pane-active-border-style fg=yellow
set -g pane-active-border-style bg="#272822"

# List of plugins
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'

# status-right
set -g @plugin 'tmux-plugins/tmux-cpu'
set-option -g status-right "host: #h #{cpu_bg_color} CPU: #{cpu_percentage} [%Y-%m-%d (%a) %H:%M:%S]" 
set-option -g status-right-length 100

# Plugins
set -g @plugin 'tmux-plugins/tmux-resurrect'

# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'
  • S-leftShift + を示す。
  • C-S-leftCtrl + Shift + を示す。

tmux起動中に上記の設定ファイルを変更した場合は以下のコマンドで反映可能

tmux source ~/.tmux.conf

ファイル下部のpluginについて次節で説明する。


pluginについて

標準機能以外の機能をpluginとして追加することができる。
pluginを使うためにはtpm(tmux plugin manager)を導入する必要がある。
以下のコマンドでダウンロード

git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm

ダウンロード後、設定ファイルの編集

末尾に以下を追加

plugin
~/.tmux.conf
# List of plugins
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'

# status-right
set -g @plugin 'tmux-plugins/tmux-cpu'
set-option -g status-right "host: #h #{cpu_bg_color} CPU: #{cpu_percentage} [%Y-%m-%d (%a) %H:%M:%S]" 
set-option -g status-right-length 100

# Plugins
set -g @plugin 'tmux-plugins/tmux-resurrect'

# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'

設定後にtmuxを起動した後にprefix -> Iを入力後、Enterを入力すればプラグインのインストールが開始される。
以下に各pluginについて説明する。

tmux-plugins/tpm

  • tmux のプラグインマネージャー
  • プラグインを導入する上で必須
  • ~/.tmux.confの末尾に記述する必要がある。

tmux-plugins/tmux-sensible

  • 基本的なオプションを自動的に設定するプラグイン
  • 以下のオプションが自動的に設定される
    tmux-sensible
    # utf8対応
    set -g utf8 on
    set -g status-utf8 on
    
    # VimでEscキーを押したときの反応をよくする
    set -s escape-time 0
    
    # スクロールバッファサイズを増やす
    set -g history-limit 50000
    
    # tmuxメッセージの表示時間
    set -g display-time 4000
    
    # ステータスラインの更新間隔
    set -g status-interval 5
    
    # Mac OS X向けの設定
    set -g default-command "reattach-to-user-namespace -l $SHELL" 
    
    # 256色表示
    set -g default-terminal "screen-256color" 
    
    # ステータスラインのキーバインドをemacs風にする
    set -g status-keys emacs
    
    # フォーカスイベントを有効化
    set -g focus-events on
    
    # 異なるサイズの端末からアクセスしたときにリサイズ 
    setw -g aggressive-resize on
    

    ※既にユーザーによって設定されている項目はそちらの設定が優先される

tmux-plugins/tmux-cpu

status_barにcpu使用率を表示可能にするプラグイン

tmux-plugins/tmux-resurrect

  • PC再起動後にセッションを復元させるプラグイン
  • Auto Saveではないので再起動前に手動保存しておく必要がある。
  • 保存: prefix + Ctrl-s
  • 復元: prefix + Ctrl-r
  • 保存されるのは以下
    • セッション
    • ウィンドウ
    • ペイン
    • コマンド履歴
    • 各ペインでのカレントディレクトリ
    • コマンド実行時のlogは保存されない

tmux-plugins/tmux-continuum

  • 自動でセッションを保存するプラグイン
  • 以下の設定を行うとtmux起動時に自動で復元可能になる。また、セッションの保存が1分間隔で行われる。
    ~/.tmux.conf
    set -g @plugin 'tmux-plugins/tmux-continuum'
    set -g @continuum-restore 'on'
    set -g @continuum-save-interval '1'
    
  • 以下を~/.bashrcに記載するとssh接続時などにtmuxのセッションがあれば、どのセッションを起動するかを選択する機能を追加することができる。
    ※pecoをインストールしていること前提
    ~/.bashrc
    ~/.bashrc
    # tmux session
    # https://qiita.com/nacht_666/items/5949d0d6e0f78593bbe5
    PERCOL=peco
    CMDLINE=$(cat /proc/$$/cmdline | xargs --null)
    if [[ ! -n $TMUX && "-bash" = ${CMDLINE} ]]; then
      # get the IDs
      ID="`tmux list-sessions`" 
      if [[ -z "$ID" ]]; then
        tmux new-session
      fi
      create_new_session="Create New Session" 
      ID="$ID\n${create_new_session}:" 
      ID="`echo -e "$ID" | $PERCOL | cut -d: -f1`" 
      if [[ "$ID" = "${create_new_session}" ]]; then
        tmux new-session
      elif [[ -n "$ID" ]]; then
        tmux attach-session -t "$ID" 
      else
        :  # Start terminal normally
      fi
    fi
    

Trouble Shooting & Tips

セッションにアタッチした際にウィンドウサイズが小さく表示される

特定のセッションにアタッチするとウィンドウサイズが小さく表示されることがある。
これは同じウィンドウに複数のクライアントがアタッチしている場合、ウィンドウサイズがアタッチしているクライアントの最小のウィンドウサイズに設定されるtmuxの仕様のため。

アタッチする際に以下のように-dオプションを付与すれば自分以外のアタッチしているユーザーを強制的にでタッチすることができる。

tmux a -d
tmux a -t [作成済のセッション名] -d

セッション名の変更

既に作成しているセッションのセッション名を以下のコマンド変更することができる。

tmux rename -t [BEFORE_SESSION_NAME] [AFTER_SESSION_NAME]

コンソールのスクロール

tmuxではマウスでのスクロールはデフォルトではできない。
prefix -> [でコピーモードを開始すればホイールでスクロールすることが出来る。

colour[数字]で指定できる色がわからない

こちらを参照


references

Discussion