Vinc3nt's Life

使用 Tmux 同時處理多個 Session

2024-04-02
tools
git
tmux
最後更新:2025-01-26
11分鐘
2178字

最近這幾週都在模擬環境練習 CKA 的題目,因為真實的考試環境並不會有圖形介面可以使用,傳統的多開終端機做法在這裡行不通。這時才發覺 tmux 真的是 Linux 使用者的救星。所以花了點時間研究與熟悉這個工具的用法。

tmux 是一款在 Unix-like 系統上運行的終端多路復用器,允許用戶從單一終端啟動多個終端會話,並在它們之間無縫切換。可以把 tmux 想象成一個強大的終端控制中心,讓你能夠在一個窗口中管理多個終端任務。這對於需要同時監控多個程序或進行多任務處理的用戶來說非常有用。

基本用法

啟動與退出

在命令列鍵入 tmux 就會進入 Tmux 窗口:

Terminal window
1
$ tmux

啟動 Tmux 後,底部會有狀態列。

透過 ctrl + d 或在命令列鍵入 exit 關閉 Tmux:

Terminal window
1
$ exit

prefix

在 tmux 中,「prefix 按鍵」是一個特殊的按鍵(或按鍵組合),用作執行 tmux 命令的前置觸發器。預設情況下,這個按鍵被設置為 Ctrl+b,說明文本中會用 C-b 呈現。當然你也可以去 ~/.tmux.conf 修改它:

Terminal window
1
set-option -g prefix C-f

我們在 Vs code 使用過差不多的東西,比如你要在 Vs code 編輯器中 format 被選擇的程式碼,需要按 Ctrl+k, Ctrl+f ,而 Ctrl+k 就是 prefix。

最簡單操作流程

在大多數的情況下,我們只是將 tmux session 當作開啟新終端的手段:

  • 新建 session : $ tmux
  • 在 tmux window 運行所需程式
  • 按下快捷鍵 Ctrl+b d 將 session 分離
  • 下次使用時,重新連接到 session: $ tmux attach

如果你對 tmux 還有興趣,讓我們繼續下去。

基本概念

讓我們先來看這張圖:

default - hackernoon

這是 tmux 的重要概念以及組成,可以簡單用以下幾句話形容他們的關係:

  • A session can have multiple windows.
  • A window is a single view.
  • A window can further split into panes.

tmux 的強大之處在於它對 session、window、和 pane 的處理方式,這些元素提供了豐富的多任務管理能力。下面我將介紹這些元素的常見用法、組合,以及相關的快捷鍵操作。

Session(會話)

你可以將「Session」想象成一個工作空間,就像你的桌面。每一個 session 都是獨立的,你可以在裡面開啟多個終端窗口,這就像你在桌面上放置了多個文件夾和應用程式。每一次當你啟動 tmux,你實際上是創建或連接到一個 session。這使得你可以離開當前的工作,關閉終端,然後在之後的任何時間重新連接回來,恢復你的工作進程,就像你離開桌面後再回來一樣,所有東西都保持原樣。

常見用法

  • 創建和管理多個工作環境:當你在處理多個項目或任務時,可以為每個項目創建一個獨立的 session,這樣可以幫助你組織和隔離工作環境。
  • 長期運行程序:在一個 session 中運行長期任務,即使關閉終端也不會影響運行。

命令

Terminal window
1
# 新建 session (如果沒有指定名稱,他就會按照序號給予數字當名稱,等於下面提到的編號)
2
$ tmux new
3
## 使用 session 名稱
4
$ tmux new -s <session-name>
5
6
# 分離 session
7
$ tmux detach
8
9
# 查看 session
10
$ tmux ls
11
# or
12
$ tmux list-session
13
14
# 接入 session
15
$ tmux attach
15 collapsed lines
16
## 使用 session 編號/名稱
17
$ tmux attach -t 0/<session-name>
18
19
# 關閉 session
20
## 使用 session 編號/名稱
21
$ tmux kill-session -t 0/<session-name>
22
23
# 切換 session
24
## 使用 session 編號/名稱
25
$ tmux switch -t 0/<session-name>
26
27
# 重命名 session (rename-session 可以簡寫為 rename)
28
$ tmux rename[-session] <new-name>
29
# 使用 session 編號/名稱
30
$ tmux rename[-session] -t 0/<old-name> <new-name>

快捷鍵

  • Ctrl+b $:重命名當前 session。
  • Ctrl+b d:從當前 session 中脫離(detach),使其在後台運行。
  • Ctrl+b s:列出所有 session 供選擇切換。

其他快捷鍵

  • Ctrl+b (:切換到上一個 session。
  • Ctrl+b ):切換到上一個 session。

Window(窗口)

在每個 session 中,你可以開啟多個 window,就像你在電腦的操作系統中可以開啟多個應用程式窗口一樣。每個 window 都是全屏的,並且可以包含一個或多個 pane。你可以將 window 看作是你工作空間中的一個大屏幕電視,你可以在這個電視上切換不同的頻道(pane),每個頻道顯示不同的內容(終端會話)。

常見用法

  • 組織相關任務:在一個 session 內,你可以為相關的任務創建不同的 window,例如,一個用於編碼,另一個用於調試。
  • 一個項目多個視角:當工作於一個項目時,可以開啟多個 window 查看不同的文件或日誌。

命令

Terminal window
1
# 新建 window (如果沒有指定名稱,名稱欄位會變成該 window 正在進入的程式名稱,如 vim, bash)
2
$ tmux new-window
3
# 新建指定名稱的 window
4
$ tmux new-window -n <window-name>
5
# 切换到指定編號的 window
6
$ tmux select-window -t <window-number>
7
# 切换到指定名稱的 window (包含沒有指定名稱,名稱欄位會變動的 window)
8
$ tmux select-window -t <window-name>
9
# 重命名當前窗口
10
$ tmux rename-window <new-name>

快捷鍵

  • Ctrl+b c:創建新 window。
  • Ctrl+b p:切換到上一個 window。
  • Ctrl+b n:切換到下一個 window。
  • Ctrl+b w:列出所有 window 供選擇切換。
  • Ctrl+b ,:重命名當前 window。
  • Ctrl+b &:關閉當前 window。

其他快捷鍵

  • Ctrl+b <number>:切換到指定編號的 window。
  • Ctrl+b <number>:切換到指定編號的 window。

default Ctrl+b w 顯示的樣子

Pane(面板)

Pane 是 window 內的一個分割區域,可以讓你在同一個 window 內同時查看和操作多個終端會話。你可以將 pane 想象成將你的電視畫面分割成幾個小的區域,每一個區域都可以顯示不同的節目。這樣,即使在有限的螢幕空間內,你也能夠同時監控和操作多個任務。

常見用法

  • 同時觀察多個進程:你可以將一個 window 分割成多個 pane,同時監控運行中的多個程序或日誌。
  • 並行工作流:在一個 window 中使用多個 pane 進行並行開發、編輯、和測試。

快捷鍵

  • Ctrl+b %:垂直分割當前 window,創建新的 pane。
  • Ctrl+b ":水平分割當前 window,創建新的 pane。
  • Ctrl+b o:在 panes 之間循環切換。
  • Ctrl+b ;:切換到上一個活動的 pane。
  • Ctrl+b x:關閉當前 pane。
  • Ctrl+b [:進入 copy 模式,按 q 離開;可以搭配這個模式 scroll up/down。

其他快捷鍵

  • Ctrl+b z:按一次當前 pane 變成全螢幕;在按一次變回來。
  • Ctrl+b q:顯示 pane 編號。
  • Ctrl+b !:將當前窗格變為獨立 window。
  • Ctrl+b <arrow key>:將游標切換到箭頭方向的 pane。
  • Ctrl+b Ctrl+<arrow key>:按箭頭方向調整 pane 大小。
  • Ctrl+b ;:切換到上一個 pane。
  • Ctrl+b o:切換到下一個 pane。
  • Ctrl+b {:與上一個 pane 交換位置。
  • Ctrl+b }:與下一個 pane 交換位置。
  • Ctrl+b Ctrl+o:所有 pane 向前移動一個位置。
  • Ctrl+b Alt +o:所有 pane 向後移動一個位置。
  • Ctrl+b <space>:切換 pane 的佈局。
  • Ctrl+b i:在狀態列顯示 window 資訊。

default Ctrl+b z 的提醒

你可能會發現 Ctrl+b o 我寫了兩次,其實是想提醒大家,平時只需要記切換到下一個 pane,把這個快捷鍵當循環切換來用就好。

其他操作

快捷鍵

  • Ctrl+b ?:查詢快捷鍵。
  • Ctrl+b t:顯示時鐘,可以用來當螢幕保護程式使用(?)。
  • Ctrl+b Ctrl+z:Suspend the current client,可以輸入 fg 恢復。
  • Ctrl+b :: 這個指令有點像 vim 的功能,需要在後面鍵入 tmux 命令,比如 new -s mysession 效果等於在 tmux 外鍵入 tmux new -s mysession

總的來說,tmux 通過這三個概念(session, window, pane)提供了一個靈活而強大的系統,讓你能夠更有效地管理和控制你的終端會話。這就像擁有一個多層次的工作空間,你可以在其中自由地移動、組織和切換你的工作和任務。

Troubleshooting

鍵入 `tmux new` 卻出現錯誤: `sessions should be nested with care, unset $TMUX to force`
1
這個消息的出現是因為 tmux 警告使用者在一個 tmux 會話中嵌套另一個 tmux 會話可能會引起鍵盤綁定和其他行為的混亂或不預期的問題。
2
你只需要先 detach 當前 session 後在新建 session 就好了。

參考

本文標題:使用 Tmux 同時處理多個 Session
文章作者:Vincent Lin
發布時間:2024-04-02