本文介紹終端複用工具tmux,當然此類工具比較好的還有有些系統自帶的screen。
如果僅僅只是多標籤的功能,那麼putty結合一些工具也可以做到,或者乾脆使用xshell,當然tmux此類工具不僅僅是那麼簡單。另外一個選擇使用tmux/screen工具的原因是,有時我們會經常需要SSH或者telent遠程登錄到Linux服務器,有一些任務需要長時間運行,比如系統備份、數據傳輸等。通常情況下我們都是開一個遠程終端窗口,因爲執行時間比較長,一般需要等待它執行完畢,在此過程中不能關閉窗口或者網絡原因斷開連接,斷開之後就Game Over了。這個功能就有點類似nohup
和setsid
命令的實現了,而tmux/screen則集nohup/setsid和多標籤於一身。廢話少說,我們接下來看如何安裝使用它。
安裝
Ubuntu
sudo apt install tmux
Redhat/CentOS
yum install tmux
快速使用
tmux new-session -s name #創建新的session,session名爲name
ctrl+b c 創建新的窗口
ctrl+b n 切換到下一個窗口
ctrl+b p 切換到上一個窗口
ctrl+b 1 切換到1號窗口
ctrl+b d 脫離回話,回到原終端
tmux ls 顯示當前所有session
tmux a -t name 進入name這個回話
tmux kill-session -t name 介紹回話,裏面運行的所有程序會一起被結束
tmux嵌套 ctrl+b+b 再發指令就是發送到內層窗口
使用技巧
幾個名詞
tmux主要包括以下幾個模塊:
session | 會話:一個服務器可以包含多個會話 |
window | 窗口:一個會話可以包含多個窗口 |
pane | 面板:一個窗口可以包含多個面板[強悍的分屏] |
小試牛刀
列出了tmux的幾個基本模塊之後,就要來點實實在在的乾貨了,和screen
默認激活控制檯的Ctrl+a
不同,tmux默認的是Ctrl+b
,使用快捷鍵之後就可以執行一些相應的指令了。當然如果你不習慣使用Ctrl+b
,也可以在~/.tmux
文件中加入以下內容把快捷鍵變爲Ctrl+a
:
# Set prefix key to Ctrl-a
unbind-key C-b
set-option -g prefix C-a
列出當前回話、連接回話
# tmux ls
0: 3 windows (created Mon Jul 2 16:50:03 2017) [150x40]
# tmux attach -t 0
以下所有的操作都是激活控制檯之後,即鍵入Ctrl+b
前提下才可以使用的命令【這裏假設快捷鍵沒改,改了的話則用Ctrl+b
】。
基本操作:
? | 列出所有快捷鍵;按q返回 |
d | 脫離當前會話,可暫時返回Shell界面,輸入tmux attach能夠重新進入之前會話 |
s | 選擇並切換會話;在同時開啓了多個會話時使用 |
D | 選擇要脫離的會話;在同時開啓了多個會話時使用 |
: | 進入命令行模式;此時可輸入支持的命令,例如kill-server所有tmux會話 |
[ | 複製模式,光標移動到複製內容位置,空格鍵開始,方向鍵選擇複製,回車確認,q/Esc退出 |
] | 進入粘貼模式,粘貼之前複製的內容,按q/Esc退出 |
~ | 列出提示信息緩存;其中包含了之前tmux返回的各種提示信息 |
t | 顯示當前的時間 |
Ctrl+z | 掛起當前會話 |
窗口操作:
c | 創建新窗口 |
& | 關閉當前窗口 |
數字鍵 | 切換到指定窗口 |
p | 切換至上一窗口 |
n | 切換至下一窗口 |
l | 前後窗口間互相切換 |
w | 通過窗口列表切換窗口 |
, | 重命名當前窗口,便於識別 |
. | 修改當前窗口編號,相當於重新排序 |
f | 在所有窗口中查找關鍵詞,便於窗口多了切換 |
面板操作:
“ | 將當前面板上下分屏 |
% | 將當前面板左右分屏 |
x | 關閉當前分屏 |
! | 將當前面板置於新窗口,即新建一個窗口,其中僅包含當前面板 |
Ctrl+方向鍵 | 以1個單元格爲單位移動邊緣以調整當前面板大小 |
Alt+方向鍵 | 以5個單元格爲單位移動邊緣以調整當前面板大小 |
空格鍵 | 可以在默認面板佈局中切換,試試就知道了 |
q | 顯示面板編號 |
o | 選擇當前窗口中下一個面板 |
方向鍵 | 移動光標選擇對應面板 |
{ | 向前置換當前面板 |
} | 向後置換當前面板 |
Alt+o | 逆時針旋轉當前窗口的面板 |
Ctrl+o | 順時針旋轉當前窗口的面板 |
z | tmux 1.8新特性,最大化當前所在面板 |
使用 tmux 命令分割窗口
可以使用 tmux 命令在一個會話中分割窗口,改變佈局,甚至開啓程序。完成這些操作的關鍵是使用 -t
target 開關。
當有一個命名 tmux 會話後,可以這樣與它進行關聯:
$ tmux attach -t [session_name]
我們使用 -t
開關將命令導向到相應的 tmux 會話。假設新建了一個命名爲development 的會話:
$ tmux new -s development
可以通過 tmux 命令對其窗口進行水平分割:
$ tmux split-window -h -t development
當與該會話關聯後,可以看到該會話的窗口被分割成了水平兩個窗格了。
分割主編輯器窗口,使其下面有一個小的終端窗口,可以使用 split-window 命令:
# scripting/development
tmux split-window -v -t development
也可以指定分割窗格所佔的百分比:
# scripting/development
tmux split-window -v -p 10 -t development
也可以選擇窗口使用的佈局:
# scripting/development
tmux select-layout -t development main-horizontal
此時,可以對首窗口進行分割和發送命令了。
向指定的窗口和窗格發送命令
每個窗口都有一個編號,其基編號由 set base-index
設置,而窗口中的每個窗格也有一個編號,其基編號由 setw pane-base-index
設置。要指定特定的窗口和窗格,使用格式: [session]:[window].[pane]
,如 development:1.2
。因此,在會話的首窗口的第二個窗格中切換到項目目錄:
# scripting/development
tmux send-keys -t development:1.2 'cd ~/devproject' C-m
行末的 C-m 是 CTRL-m ,表示發送一個回車鍵。
批處理腳本
tmux new-session -s name1 -d #創建新的session,session名爲name1,並立即脫離
tmux send-keys -t name1 'nslookup g.cn' C-m #執行命令
tmux new-window -t name1 #開一個新窗口
tmux send-keys -t name1 'ping 8.8.8.8' C-m #執行命令
tmux new-window -t name1
tmux send-keys -t name1 'ps -ef' C-m
tmux new-window -t name1
tmux send-keys -t name1 'netstat -antup' C-m
引用
http://kumu-linux.github.io/blog/2013/08/06/tmux/
http://www.atjiang.com/pragmatic-tmux-scripting-customized-envs/