tmux 終端複用詳解

薰衣草的旋律發表於2018-04-22

tmux是什麼

我們在linux伺服器上的工作一般都是通過一個遠端的終端連線軟體連線到遠端系統進行操作,例如使用xshell或者SecureCRT工具通過ssh進行遠端連線。在使用過程中,如果要做比較耗時的操作,例如有時候進行編譯,或者下載大檔案需要比較長的時間,一般情況下是下班之後直接執行希望第二天早上過來執行完成,這樣就不用耽誤工作時間。但是網路有時候不穩定,可能在半夜會出現連線斷掉的情況,一旦連線斷掉,我們所執行的程式也就中斷,我們當然可以寫一個指令碼後臺執行,但是還是不方便。那麼有沒有一種工具可以解決這樣的問題呢。這就是我們這裡要提到的tmux了。其實類似tmux的工具還有很多。例如gnu screen等。tmux剛好可以解決我們描述的問題,當我們在tmux中工作的時候,即使關掉SecureCRT的連線視窗,再次連線,進入tmux的會話我們之前的工作仍然在繼續。

tmux是一個linux下面的工具,在使用之前需要安裝,就像安裝linux下的其他工具一樣方便。首先我們通過SecureCRT連線登入遠端的linux機器,我們將此時的環境稱為終端環境。如果這個機器上並沒有安裝tmux,我們需要安裝。例如在CentOs上是yum install tmux,完成之後我們就可以使用tmux命令了。tmux中有3種概念,會話,視窗(window),窗格(pane)。會話有點像是tmux的服務,在後端執行,我們可以通過tmux命令建立這種服務,並且可以通過tmux命令檢視,附加到後端執行的會話中。一個會話可以包含多個視窗,一個視窗可以被分割成多個窗格(pane)。首先我們來看一下tmux的會話。

tmux的會話

1. tmux new -s session1 新建會話

使用 tmux new -s 命令新建一個會話 -s (其實是session的頭字母)。後面指定會話名即可。執行之後會從shell的終端環境進入到會話環境中,並停留在剛才新建的會話中。例如:

session

可以看到進入session之後的顯示,在下面有一條綠色的狀態指示欄,左邊顯示的是當前會話的名字,緊接著是會話中的視窗(window)序號以及視窗名字。關於視窗的概念我們後面再說,視窗名字後面有一個星號*表示是我們操作的當前視窗,一個會話中可以有多個視窗。當進入一個會話之後,會自動建立一個視窗。如上圖所示,上面的環境在本章中稱為會話環境。這樣我們就已經開始了tmux的使用,如果此時關閉掉SecureCRT軟體,下次在進入,該會話仍然在執行工。也就是說我們在剛剛進入的會話環境中使用wget下載一個超大的檔案,或者是編譯一個非常耗時的專案,我們關閉掉該SecureCRT的連線,下次再進入,這個會話依然存在,會話裡面執行的編譯命令或者wget下載命令仍然在執行,並不會因為關閉SecureCRT而終止,這正是我們需要的功能。不受SecureCRT網路連線的影響。甚至我們可以關掉整個SecureCRT程式。

2. ctrl+b d 退出會話,回到shell的終端環境

我們剛才是通過 tmux new -s 命令建立一個tmux會話並進入該會話的,如果要退出這個會話環境回到終端環境(會話裡面的程式不會退出在後臺保持繼續執行)。應該如何操作呢,例如上圖,當前我們在tmux的會話環境中,使用一個快捷鍵 ctrl+b d (按ctrl+b 之後再按一個字母d即可,字母d是detach的縮寫)。操作之後的結果如下:

detach

可以看到綠色的狀態列消失了,而頂部出現一個[detached],表示已經脫離tmux會話,現在已經不在tmux的會話環境中回到shell終端環境中了。

這裡有必要說一下在tmux會話環境中,我們經常會用到tmux的組合鍵,一般的組合鍵中都會加一個字首也就是 ctrl+b 另外,在後面的描述中,我們說的終端環境是指使用SecureCRT進入遠端linux之後但是沒有進入tmux的會話環境的狀態。

通過上面的操作 ctrl+b d 之後,回到終端環境,實際上現在tmux的會話還在後臺執行,如何檢視呢。

3. tmux ls 終端環境檢視會話列表

在終端環境中,我們可以通過tmux ls 命令來檢視後臺執行中的tmux的會話列表,例如:

tmuxls

可以看到在列出的列表中,只有1行,說明只有一個session,其中左邊的session1表示該session的名字,中間2 windows說明該session1會話中有2個window,右邊表示該會話建立的時間。如果該機器中有多個tmux會話在後臺執行,那麼這裡會列出多行。因為tmux會話在後臺執行,我們猜測實際上肯定是有tmux的程式在後臺執行來維持這些會話。我們可以ps看一下:

pstmux

可以看到我們之前建立會話的命令還在後端執行。

4. ctrl+b s 會話環境檢視會話列表

上面的命令中我們已經退出了tmux的會話環境,在終端環境中通過tmux ls 來列出當前linux機器後臺執行的tmux會話列表。那麼假設我們當前環境已經在tmux的會話環境中,我們如何得到當前tmux的會話列表呢,如果每次都要退出當前會話,先回到shell終端環境再執行tmux ls 來檢視就很不方便,那麼在tmux的會話環境中,我們可以通過 ctrl+b s 來獲取當前linux機器上tmux所有的後臺會話列表,例如操作之後顯示如下:

sessionls

此時可以通過方向鍵選擇會話並回車,在會話間進行切換。

5. tmux a -t session1 從終端環境進入會話

如果在終端環境中執行 tmux ls 檢視有tmux會話正在後臺執行,如何進入到該正在後臺中執行的會話呢,通過執行 tmux a -t session1 即可進入到該已存在的會話 session1 中。其中a字母是attach的頭字母,表示附加, -t 指定要進入已存在的會話名,如果不存在則會報告 session not found 錯誤。

6. tmux kill-session -t session1 銷燬會話

我們可以在終端環境和會話環境中銷燬會話,例如在終端環境中執行 tmux kill-session -t session1 結束名字為session1的tmux會話。

在會話環境中執行 ctrl+b : (注意按組合鍵之後再按一個冒號鍵),狀態列變成黃色之後提示我們可以在會話環境中輸入命令,此時輸入 kill-session -t session1 回車即可。其中session1是要銷燬的會話名。

會話銷燬之後,在終端環境中執行tmux ls 或者在會話環境中執行 ctrl+b s 則被銷燬的會話不會再出現在會話列表中。

7. tmux rename -t old_session_name  new_session_name  重新命名會話

我們可以在終端環境中將會話重新命名,如上面的命令,重新命名之後通過 tmux ls 命令在終端環境中看到的列表中會顯示會話的新名稱。

8. ctrl + b $ 重新命名會話 (在會話環境中)

在會話環境中,我們可以通過字首命令加上 $ 的組合來重新命名當前開啟的會話的名字

tmux的window

一個tmux的會話中可以有多個視窗(window),每個視窗又可以分割成多個pane(窗格)。我們工作的最小單位其實是窗格。預設情況下在一個window中,只有一個大窗格,佔滿整個視窗區域。我們在這個區域工作。

本節我們講解一下tmux視窗的相關操作,後面我們再說一下關於窗格(pane)的相關知識。首先在新建立的一個會話裡面是會預設建立一個視窗的。正如我們上面提到過的圖一樣,如下所示:

session

新建立的會話中會預設建立一個視窗,該視窗名字一般是登陸終端的使用者名稱@主機名,我們可以通過 crtl+b , (組合鍵之後按一個逗號)來修改當前視窗的名字,如上圖所示的視窗名字myserver1就是修改之後的名字。該名字後面有一個*號,表示該視窗是活動視窗(鍵盤輸入會輸入到該視窗中)

1. 建立window

可以在當前會話視窗中建立多個視窗,例如 ctrl+b c 建立之後會多出一個視窗如下圖所示:

create_window

預設情況下建立出來的視窗由視窗序號+視窗名字組成,視窗名字可以由上面提到的方法修改,可以看到新建立的視窗後面有*號,表示是當前視窗。

2. 切換window

在同一個會話的多個視窗之間可以通過如下快捷鍵進行切換:

ctrl+b p (previous的首字母) 切換到上一個window。

ctrl+b n (next的首字母) 切換到下一個window。

ctrl+b 0 切換到0號window,依次類推,可換成任意視窗序號

ctrl+b w (windows的首字母) 列出當前session所有window,通過上、下鍵切換視窗

ctrl+b l (字母L的小寫)相鄰的window切換

3. ctrl+b & 關閉window

ctrl+b & 關閉當前window,會給出提示是否關閉當前視窗,按下y確認即可。

tmux的pane

tmux的一個視窗可以被分成多個pane(窗格),可以做出分屏的效果。

1. ctrl+b % 垂直分屏(組合鍵之後按一個百分號),用一條垂線把當前視窗分成左右兩屏。

pane_v

2. ctrl+b " 水平分屏(組合鍵之後按一個雙引號),用一條水平線把當前視窗分成上下兩屏。

pane_h

分屏之後游標停留在哪個pane上,表示該pane是活動的,另外一般情況下當前pane會被綠色的線條圍起來。一般分屏之後當前視窗名字會重置為預設視窗名字。通過多次分屏操作,我們可以得到各種樣子的分屏效果,例如下圖顯示的是一次垂直分屏之後,在右邊pane中再次水平分屏的效果:

pane_multi

可以看到右下角的分屏是綠色框,說明是當前活動pane

3. 切換pane

ctrl+b o 依次切換當前視窗下的各個pane。

ctrl+b Up|Down|Left|Right 根據按箭方向選擇切換到某個pane。

ctrl+b Space (空格鍵) 對當前視窗下的所有pane重新排列布局,每按一次,換一種樣式。

ctrl+b z 最大化當前pane。再按一次後恢復。

4. 關閉pane

ctrl+b x 關閉當前使用中的pane,操作之後會給出是否關閉的提示,按y確認即關閉。

tmux window中的歷史輸出檢視

在tmux裡面,因為每個視窗(tmux window)的歷史內容已經被tmux接管了,當我們在每個tmux的window之間進行來回切換,來回操作,那麼我們沒有辦法看到一個window裡面螢幕上的歷史輸出。沒辦法使用滑鼠滾動(例如在SecureCRT中)檢視之前的內容,在SecureCRT中通過滑鼠滾動看到的輸出一定是各個tmux的window的輸出混亂夾雜在一起的,如果要看當前視窗的歷史內容,那麼應該怎麼辦呢,通過在當前的tmux window 按 ctrl-b 進入copy mode,然後就可以用PgUp/PgDn來瀏覽歷史輸出了,按q退出。

總結

tmux中的最重要的三個概念會話,視窗,pane的使用方法已經介紹完畢,其實這是我們操作tmux的最常用功能,如果掌握好,足以應付大多數工作。另外tmux還有一些高階用法,例如可以個性化的配置其組合鍵(官方預設的ctrl+b組合鍵按起來不太方便可以修改,UI設定,滑鼠支援,複製貼上等),但是我覺得這些高階功能基本不太用的到。如有需要大家可以自行查閱相關資料。

 

相關文章