tmux 終端復用詳解


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設置,鼠標支持,復制粘貼等),但是我覺得這些高級功能基本不太用的到。如有需要大家可以自行查閱相關資料。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM