Try   HackMD

實用技巧-tmux

tags: tmux linux學習筆記

前言

在學習DL這些技術的時候,訓練模型常常會用到實驗室的遠端設備,像筆者的實驗室中就有幾顆V100或GTX3080可以使用
在一次使用中,如果遇到頁面登出、斷線等問題,再登入回去就沒有程式的一些提示訊息跳出(該terminal已經被關掉了),但其實該支程式依然在背景執行,為了避免這樣的問題,故有此篇的誕生
此篇內容參考tmux 快速入門筆記感謝該作者的貢獻

關於tmux

甚麼是tmux

tmux是一個terminal multiplexer,概念上的意思就是在一個終端機(一個console)下開啟多個視窗或是分割視窗區塊(在tmux中會有視窗(window)和視窗區塊(pane)),每個pane會各自獨立執行一個terminal instance(各自輸入輸出的介面)讓我們可以同時使用多個指令,而無須開啟多個終端機視窗。

tmux會在同一個session(連線狀態下的執行環境)保存這些視窗和視窗區塊。我們可以在任何時間離開這個連線(這被稱作detaching)

而tmux會繼續維持這個session,直到把tmux server砍掉或是重開機,且重點是我們可以隨時重新回到(attaching)上次離開session的狀態

  • 原本我們打開一個terminal和機器建立一個session,當我們關閉視窗時此session就會關閉,我們剛下的指令就會被終止,使用tmux意味著我們通過tmux server和機器建立session,我們的操作視窗或視窗區塊則是和tmux server溝通。
  • seesion概略的說,指的是終端機和主機間建立的一個連線。

當我們ssh斷線時,其實對於tmux來說只是和tmux server中斷,tmux server會在伺服器端背景繼續執行並保存剛剛的session。要繼續回到剛剛的session只要重新ssh連線回去並在和session連線(attach)即可。

總結來說,tmux的最基本兩大功能就是視窗管理和session管理,它的核心概念就像是一個更輕易使用且強大的螢幕替代工具。

tmux的實戰

tmux的安裝

大部分OS中,安裝tmux都相當簡單。
以Ubuntu為例,只需要一行指令:

sudo apt-get install tmux

即可完成安裝

建立新的session

當我們要建立一個session時,只要輸入tmux即可

tmux

這個指令會建立一個新的tmux session,你會看到下面多了一條綠色的狀態列。狀態列是tmux很重要的一個部分。
除了顯示當前的視窗(在左邊)它同時也會顯示一些關於系統的資訊像是時間(在右邊)。當然狀態列也是可以客製化的,像是顯示行事曆、電量等等
(筆者OS:真的就是另一個桌面)

分割視窗區塊(Panes)

現在我們已經建立了第一個session,當我們建立session的時候,tmux預設會開啟一個視窗包含一個單一的視窗區塊。
當我們執行tmux指令時,我們需要先輸入一個前置鍵,tmux的預設是Ctrl+b。
接著要分割區塊使用的指令是Ctrl+b %,這個指令會幫我們把當前畫面切割成垂直左右的兩個視窗區塊。
如果要水平切割則是Ctrl+b "。

  • Note: C- 指的是Ctrl+某個鍵一起按,M- 則是Alt或Option和某個鍵一起按。

切換操作的視窗區塊

現在我們的操作會被侷限在剛剛新建立的視窗區塊中。但如果想想回到左邊的那個,這時候可以使用Ctrl+b搭配方向鍵即可。
(但筆者自己在aiForge上使用此指令無法生效)

關閉視窗區塊

使用Ctrl+d即可
(補充:想要關閉分割視窗區塊則可使用Ctrl+b x)

建立視窗

tmux的視窗類似於Linux中建立一個虛擬桌面,如:KDE,Gnome等
常用的操作指令有:

  • Ctrl+b c 建立一個新視窗
  • Ctrl+b p 上一個視窗
  • Ctrl+b n 下一個視窗
  • Ctrl+b <number> 依照編號直接切換

Session管理

如果已經完成了工作,要detach只需要Ctrl+b d,又或者Ctrl+b D可以選擇要從那個session離開,但要注意的是,這些session依然在背景執行

要返回剛剛的session,第一步要先知道要重新連上哪個session,透過下面的指令可以列出在背景執行的session。

tmux ls

要連回session我們需要指定參數,例如要連回編號0的session則輸入

tmux attach -t 0

-t 0 這個參數我們是透過tmux ls來取得的。
若對於名稱有所偏好的話,可以使用

tmux new -s <name>

此時這個新建的session就會被命名為<name>,除此之外,也可以對以存在的session修改名稱

tmux rename-session -t <old name> <new name>

補充:若要刪除不需要的session則使用

tmux kill-session -t <name>

以上是原作者所記錄的一些基本功能和操作,當然tmux還有更多神奇的功能,可以參考此篇

為什麼使用tmux?

一些優點:

  • session的處理:attach和detach協助我們在不同情境和遠端連線的情況下切換,保留session
  • 跨平台:我們可以在Mac底下也可以在linux底下使用,甚至遠端伺服器或Raspberry Pi, BeagleBones等等都可以使用一樣的東西。
  • 客製化:可以自訂tmux的環境設定並和不同平台環境同步

進階

若有興趣想要知道更多關於tmux的其他功能,輸入Ctrl+b ?會看到所有支援的指令,Ctrl+c可以離開Help。
當然網路上還有很多資源,如果有興趣想再更進一步探討tmux,可以上網找尋更多資源,但這已經超出本篇的內容了。

整理

# 新增
$ tmux
# OR
$ tmux new -s <your_session_name>

# session 列表
$ tmux ls

# 重新連線 session
$ tmux a -t 0
# OR
$ tmux a -t <session_name>

# 刪除 session
$ tmux kill-session -t 0
# OR
$ tmux kill-session -t <session_name>
# OR
$ tmux kill-session -a # 全部

# 刪除 tmux server
$ tmux kill-server

# 重新命名 session
$ tmux rename-session -t 0 <new_session_name>

# 快捷鍵/視窗管理
# C-b ? Help
# C-b s 秀出目前所有session
# C-b c 新增視窗
# C-b, 視窗命名
# C-b w 視窗列表
# C-b f 尋找視窗
# C-b & 刪除視窗
# C-b % 垂直分割區塊
# C-b “ 水平分割區塊
# C-b <方向鍵>
# C-b p 上一個視窗
# C-b n 下一個視窗
# C-b <number> 依照編號直接切換(編號顯示於狀態列)
# C-b d 離開 session
# C-b x 關閉 Pane
# C-d   關閉 Pane
# C-b z 讓一個 Pane 變成全螢幕,在輸入一次則回到剛剛的尺寸