在伺服器建立多個程序時,該如何有效率的管理及切換每個程序的終端界面呢?Tmux 不僅能做到這點,還能在使用者登出後,使程序於背景繼續運作。
Screen#
先前有介紹過指令「Screen
」(在「"Screen" Command 讓程式在背景執行,並隨意切換,即便登出也不會中斷!」這篇文章中),但比起該指令,接下來要介紹的「Tmux
」相對更多人使用,也更為出名。
Tmux#
「Tmux
」由「Nicholas Marriott」開發,於 2009 年 9 月 22 日釋出第一版本。
該指令類似於先前介紹過的「Screen
」,可以建立多個終端 Session,並方便的將程序於背景及前台間切換。
可以透過以下方法安裝(具體選擇請依照不同平台決定):
- apt install tmux
- yum install tmux
- brew install tmux
或是於 Github 下載原始檔自行編譯:https://github.com/tmux/tmux
Create a session#
要創建一個 tmux session,你只需要輸入指令「tmux
」,便會創建並進入一個 tmux session。
如果要退出 session 則像一般的終端一樣直接輸入「exit
」即可(部份情況支援使用 ctrl
+d
的快捷鍵)。
其預設的 session 名稱是以數字 0、1、2 以此類推命名創建,例如上述的範例,圖中可見左下角顯示著「[0]
」,那便是該 session 的名稱(ID)。
如果要自訂 session 名稱,可以透過指令「tmux new -s <name>
」來指定,e.g.
1# 創建名為「hello」的 tmux session
2tmux new -s hello
如果要透過一行指令創建 tmux session 並執行指令,只需要在後方加上指令即可:
1tmux new -s hello 'cd ~/scripts/; bash script.sh; bash'
例如以上範例,用「'
」包圍是為了怕一些如「;
」等特殊符號跳脫,最後加上「bash
」則是希望在腳本執行完後,卡住 tmux session,而不是直接結束。
Background Session & Show Sessions list#
補充說明一下,
如果要創建一個一開始就在背景執行的 session,則在創建時加入參數「-d
」,e.g.
1# 創建一個名為 "bg" 的背景 tmux session
2tmux new -d -s bg
p.s. 「-d
」指的是「detach
」。
p.s. 切記「-d
」不能緊跟在「-s
」後方,會被當成是 session id 處理。(但tmux new -s bg -d
這麼寫是可以的)
如果要使當前的 session 於背景執行,可以透過 tmux 特殊的組合鍵來完成。
tmux 的組合鍵為 ctrl
+b
然後釋放按鍵後,接著按下其他功能按鍵。
例如要使當前 session 於背景處理,則是使用功能「d
(detach)」。
因此組合按鍵為 ctrl
+b
, d
,即同時按下 ctrl
+b
後釋放,接著按下 d
。
沒意外應該就會退回原本所在的終端了。
要查看當前背景正在運作的 tmux sessions,則可以透過指令「tmux ls
」來查看:
Attach Background Session#
要 attach 回背景的 tmux session,則需要使用指令「tmux a -t <session-id>
」,e.g.
1# attach 上名為「alpaca」的 session
2tmux a -t alpaca
p.s. 其中「a
」指的是「attach
」;「-t
」指的是「target
」。
並且當你在 tmux 的 session 當中時,tmux 也提供一個有趣的切換方式。
使用組合鍵 ctrl
+b
, w
,接著便可以用方向鍵在不同的 sessions 間切換(按enter
即可快速 attach session):
按下方向鍵「=>
(Right)」來展開 session 的程序:
p.s. 方向鍵「<=
(Left)」可以收回展開。
Kill Session#
要刪除 session 則使用「tmux kill-session -t <session-id>
」,e.g.
1# 刪除名為 "hello" 的 tmux session
2tmux kill-session -t hello
另外也有一個參數,可以用來刪除「除了指定的 session 外的所有 sessions」,e.g.
1# 刪除除了 "alpaca" 外的所有 tmux sessions
2tmux kill-session -a -t alpaca
要刪除所有 tmux sessions
,則使用「tmux kill-server
」。
p.s. 這會刪除所有 tmux 程序
Split Windows#
而 tmux 最廣為人知的用法則是可以將一個終端劃分多個 windows。
分割視窗的組合鍵有兩種,分別是用於垂直分割
的「ctrl
+b
, "
」;及水平分割
的「ctrl
+b
, %
」。
(p.s. 注意英文雙引號「"
」及百分號「%
」,通常需要按住shift
來觸發)
水平分割效果如下:
垂直分割:
並且可以多次切割:
要在不同的 windows 間切換,則可以使用組合鍵 ctrl
+b
, <方向鍵>
。
(如果你不喜歡這種方式,可以看看最後補充的滑鼠操作方式)
Others#
tmux session 指令#
tmux 提供一系列的指令可做使用(詳細不多做介紹,請自行搜索相關資料)。
其指令輸入方式為組合鍵「ctrl
+b
, :
」,接著輸入指令並按下 enter。
舉例前面介紹的刪除 tmux session 的方式,使用 tmux 內部指令也可以辦到:
1# attach 上一個 tmux session (attach "hello")
2tmux a -t hello
3
4# 按下 <ctrl> + <b>, ":",然後輸入「kill-session」
5:kill-session
重新命名 session#
1# 重新命名 session "old-name" 為 "new-name"
2tmux rename -t old-name new-name
啟用滑鼠操作模式#
在滑鼠操作模式下,可以直接用滑鼠點擊 tmux windows 來切換,支援滾輪滑動終端,並且選取文字時可以自動複製。
該功能通常預設是關閉的,可以透過上述的 tmux session 指令輸入方法來啟用。
使用組合鍵 ctrl
+b
, :
後,便可以開始輸入 tmux 內部指令「set -g mouse on
」,即可使用滑鼠操作模式。
如果需要 tmux 記住該設定,每次開啟都自動啟用,則可以在 tmux config 檔案中設定。
tmux config 檔案通常位於「~/.tmux.conf
」,如果不存在則自行創建即可。
並在檔案中寫上「set -g mouse on
」。
這裡有一些需要特別注意的部份:
~/.tmux.conf
的檔名前方有個.
- tmux config 當中寫的
set -g mouse on
前方並沒有冒號「:
」 - 若有其他指令要寫入 tmux config,請記得要空行(別寫在同一行)
並且,當更改完設定後,tmux 並不會馬上生效,有幾種方式讓 tmux 讀取新的設定:
- 最暴力的方式就是直接重開 tmux,使用先前提到的「
tmux kill-server
」。 - 或者於終端輸入
tmux source-file ~/.tmux.conf
來強制 tmux 讀取設定檔。 - 於 tmux session 當中也可以使用 tmux session 內部指令「
:source-file ~/.tmux.conf
」
豐富 tmux 終端顏色#
如果 tmux 終端顯示的文字顏色不像平常使用的終端來的豐富,
可以試試使用 tmux 設定「set -g default-terminal "screen-256color"
」來使用更多顏色。
與滑鼠操作的部份一樣,可以直接使用 tmux 內部指令,或者加入 tmux config 當中。