# 實用技巧-tmux ###### tags: `tmux` `linux學習筆記` ## 前言 在學習DL這些技術的時候,訓練模型常常會用到實驗室的遠端設備,像筆者的實驗室中就有幾顆V100或GTX3080可以使用 在一次使用中,如果遇到頁面登出、斷線等問題,再登入回去就沒有程式的一些提示訊息跳出(該terminal已經被關掉了),但其實該支程式依然在背景執行,為了避免這樣的問題,故有此篇的誕生 *此篇內容參考[tmux 快速入門筆記](https://andyyou.github.io/2017/11/27/tmux-notes/)感謝該作者的貢獻* ## 關於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還有更多神奇的功能,可以參考[此篇](https://www.jianshu.com/p/24a9d8563e1c) ## 為什麼使用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 變成全螢幕,在輸入一次則回到剛剛的尺寸 ```