1. 程式人生 > 實用技巧 >01 Linux小工具之tmux

01 Linux小工具之tmux

什麼是tmux

我們在Linux伺服器上的工作一般都是通過一個遠端的終端連線軟體連線到遠端系統進行操作,例如使用xshell或者Xshell工具通過ssh進行遠端連線。在使用過程中,如果要做比較耗時的操作,例如有時候進行編譯,或者下載大檔案需要比較長的時間,一般情況下是下班之後直接執行希望第二天早上過來執行完成,這樣就不用耽誤工作時間。但是網路有時候不穩定,可能在半夜會出現連線斷掉的情況,一旦連線斷掉,我們所執行的程式也就中斷,我們當然可以寫一個指令碼後臺執行,但是還是不方便。那麼有沒有一種工具可以解決這樣的問題呢。這就是我們這裡要提到的tmux了。其實類似tmux的工具還有很多。例如gnu screen等。tmux剛好可以解決我們描述的問題,當我們在tmux中工作的時候,即使關掉Xshell的連線視窗,再次連線,進入tmux的會話我們之前的工作仍然在繼續。
tmux是一個Linux下面的工具,在使用之前需要安裝,就像安裝Linux下的其他工具一樣方便。首先我們通過xshell連線登入遠端的linux機器,我們將此時的環境稱為終端環境。如果這個機器上並沒有安裝tmux,我們需要安裝。例如在CentOS上是yum install tmux,完成之後我們就可以使用tmux命令了。tmux中有3種概念,會話,視窗(window),窗格(pane)。會話有點像是tmux的服務,在後端執行,我們可以通過tmux命令建立這種服務,並且可以通過tmux命令檢視,附加到後端執行的會話中。一個會話可以包含多個視窗,一個視窗可以被分割成多個窗格(pane)

安裝tmux

[root@localhost ~]# yum -y install tmux
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
Resolving Dependencies
--> Running transaction check
---> Package tmux.x86_64 0:1.8-4.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

=======================================================================================================================================================================
 Package                               Arch                                    Version                                     Repository                             Size
=======================================================================================================================================================================
Installing:
 tmux                                  x86_64                                  1.8-4.el7                                   base                                  243 k

Transaction Summary
=======================================================================================================================================================================
Install  1 Package

Total download size: 243 k
Installed size: 558 k
Downloading packages:
tmux-1.8-4.el7.x86_64.rpm                                                                                                                       | 243 kB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : tmux-1.8-4.el7.x86_64                                                                                                                               1/1
  Verifying  : tmux-1.8-4.el7.x86_64                                                                                                                               1/1

Installed:
  tmux.x86_64 0:1.8-4.el7

Complete!

tmux會話

建立會話

語法:
tmux new -s session-name

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

例1:
建立會話compile-python

[root@localhost ~]# tmux new -s compile-python			# compile-python是session名

退出會話

快捷鍵:
Ctrl + b d
說明:按完Ctrl + b 組合鍵後,按d

我們剛才是通過 tmux new -s 命令建立一個tmux會話並進入該會話的,如果要退出這個會話環境回到終端環境(會話裡面的程式不會退出在後臺保持繼續執行)。應該如何操作呢,例如上圖,當前我們在tmux的會話環境中,使用一個快捷鍵 ctrl+b+d (按ctrl+b 之後再按一個字母d即可,字母d是detach的縮寫)。可以看到綠色的狀態列消失了,而頂部出現一個[detached],表示已經脫離tmux會話,現在已經不在tmux的會話環境中回到shell終端環境中了。
這裡有必要說一下在tmux會話環境中,我們經常會用到tmux的組合鍵,一般的組合鍵中都會加一個字首也就是 ctrl+b 另外,在後面的描述中,我們說的終端環境是指使用Xshell進入遠端linux之後但是沒有進入tmux的會話環境的狀態。
通過上面的操作 ctrl+b d 之後,回到終端環境,實際上現在tmux的會話還在後臺執行,如何檢視呢。
例1:

檢視tmux會話列表

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

例1:

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

檢視後臺tmux程序

重新進入會話

語法:
tmux a -t session-name

說明:字母a是attach的頭字母,表示附加, -t 指定要進入已存在的會話名,如果不存在則會報告 session not found 錯誤。

例1:

執行後結果:

在會話環境中,檢視會話列表

快捷鍵:
Ctrl + b s
在列表中,我們可以通過方向鍵選擇會話,回車後即可以切換到該會話中

例1:
attached表示當前正在使用的

銷燬會話

在終端結束會話

語法:
tmux kill-session -t session-name

例1:
從終端結束會話

在會話中結束會話:

方式一:

快捷鍵:
Ctrl + d

方式二:

命令:exit

方式三:

快捷鍵:
Ctrl + b :
Ctrl + b 然後輸入冒號( :), 底部的綠色條會變成黃色,輸入kill-session然後回車

例1:
按方式一結束會話
進入compile-ngix會話,按Ctrl + d結束會話

例2:
按方式二結束會話

例3:
按方式三結束會話
# 先進入該會話

#輸入Ctrl + b 和冒號,等底部變成黃色後,輸入kill-session

重新命名會話

方式一:在終端環境中
語法:
tmux rename -t old_session_name new_session_name

方式二:在會話中
快捷鍵:
Ctrl + b $

例1:
用方式一進行重新命名
從下圖中可以看到我們將compile-python該為了session1-python

例2:
用方式二進行重新命名
# 修改前

# 修改中

# 修改前後檢視

tmux視窗

建立新視窗

快捷鍵:
Ctrl + b c
預設我們建立tmux會話回建立一個視窗,視窗編號從0開始,Ctrl + b c會在會話中,重新建立一個視窗, 當前啟用的視窗後面會有一個星號,入下圖中新建視窗1,後面有個星號
例1:

視窗切換

快捷鍵:

快捷鍵 說明
Ctrl + b p 切換到上一個視窗 (p可以理解為previous的首字母)
Ctrl + b n 切換到下一個視窗 (n可以理解為next的首字母)
Ctrl + b 0 切換到0號視窗,依次類推,可以快取任意視窗序號
Ctrl + b w 列出當前session所有window,通過上、下鍵切換視窗(w可以理解為windows的首字母)
Ctrl + b l (字母L的小寫)相鄰的window切換

給視窗改名

快捷鍵:
Ctrl + b ,
修改視窗的名稱可以通過Ctrl + b 再加逗號來進行,在輸入快捷鍵後,底部綠色背景會變成黃色,修改完畢後直接回車即可。如果要給其他視窗修改,需要先切換視窗,然後再進行修改

例1:
修改新建立的1號視窗為new_windows
# 輸入快捷鍵後


關閉視窗

快捷鍵:
Ctrl + b &

關閉當前window,執行快捷鍵後,會給出提示是否關閉當前視窗,按下y確認即可
例1:

tmux窗格

tmux的一個視窗可以被分成多個pane(窗格),可以做出分屏的效果(相當於Sxhell複製了一個終端,再該窗格中進行的一些劃分,不影響另一個窗格),分屏之後游標停留在哪個pane上,表示該pane是活動的,一般分屏之後當前視窗名字會重置為預設視窗名字(即修改名字之前的名字)

左右分屏(垂直分屏)

快捷鍵:
Ctrl + b %
此快捷鍵用於將螢幕分成左右的兩個屏

例1:

上下分屏(水平分屏)

快捷鍵:
Ctrl + b "
後面接的是一個雙引號
例1:

多次分屏效果

例1:
先垂直分屏,然後再水平分屏,再垂直分屏,經過多次分屏,展現效果如下,需要注意的是,這些都是在win01這個窗格里面進行的操作,如果切換了windows,則win02中是沒有這些的,當然沒進行一下分屏,重新命名的名字都會重置

關閉分屏

快捷鍵:
Ctrl + b x
關閉分配不會影響重新命名,之前的重新命名依然有效
例1:
刪除了一個垂直分屏

常用快捷鍵彙總:

Ctrl + b 描述
系統操作 ? 列出所有快捷鍵;按q返回
d 脫離當前會話;這樣可以暫時返回Shell介面,輸入tmux attach能夠重新進入之前的會話
D 選擇要脫離的會話;在同時開啟了多個會話時使用
Ctrl+z 掛起當前會話
r 強制重繪未脫離的會話
s 選擇並切換會話;在同時開啟了多個會話時使用
: 進入命令列模式;此時可以輸入支援的命令,例如kill-server可以關閉伺服器
[ 進入複製模式;此時的操作與vi/emacs相同,按q/Esc退出
~ 列出提示資訊快取;其中包含了之前tmux返回的各種提示資訊
視窗操作 c 建立新視窗
& 關閉當前視窗
數字鍵 切換至指定視窗
p 切換至上一視窗
l (小寫L)在前後兩個視窗間互相切換
w 通過視窗列表切換視窗
, (逗號)重新命名當前視窗;這樣便於識別
. (英文的句號,實心點)修改當前視窗編號;相當於視窗重新排序
f 在所有視窗中查詢指定文字
面板操作 " (英文狀態的引號)將當前面板平分為上下兩塊
% 將當前面板平分為左右兩塊
x 關閉當前面板
! 將當前面板置於新視窗;即新建一個視窗,其中僅包含當前面板
Ctrl+方向鍵 以1個單元格為單位移動邊緣以調整當前面板大小
Alt+方向鍵 以5個單元格為單位移動邊緣以調整當前面板大小
Space (空格)在預置的面板佈局中迴圈切換;依次包括even-horizontal、even-vertical、main-horizontal、main-vertical、tiled
q 顯示面板編號
o (小寫字母O)在當前視窗中選擇下一面板
方向鍵 移動游標以選擇面板
{ 向前置換當前面板
} 向後置換當前面板
Alt+o 逆時針旋轉當前視窗的面板
Ctrl+o 順時針旋轉當前視窗的面板