一文帶你走進 Linux 小工具 - tmux
一、背景
Linux shell 是 L inux 程式設計師、運維人員不可或缺的工具。往往是透過 ssh 工具(如 XShell 和 SecurtCRT)連線到 L inux,執行 shell 命令。
你是否有遇到如下的情況:
(1)一個命令需要很長時間才能執行完成,但是由於與 L inux 連線中斷,或者執行的視窗關閉了,導致命令提前退出;
(2)需要同時看兩個或更多的視窗,對比檔案內容或監控多個任務。
如何解決上述遇到的情況,是否存在可靠的工具可供使用?本 期技術貼將為大家帶來 Linux 小工具 - tmux 的介紹,它是一個 terminal multiplexer(終端複用器),可以啟動一系列終端會話。主要特點是 shell 連線斷開後,視窗中仍然保持執行環境。當下次登入到該伺服器後,可以透過 attach 命令連線到之前的視窗,繼續之前的工作。
二、安裝
tmux 是一個用 C 語言開發的開源工具,原始碼地址:,當前有 28.9k 個 star,可見其很受歡迎。只能在 L inux 生態的環境中執行,常見的 L inux 發行版中都內建了安裝包,另外也可以原始碼安裝。
1. 原始碼安裝
git clone .git cd tmux sh autogen.sh ./configure && make
2. 安裝包安裝
# Ubuntu 或 Debian $ sudo apt-get install tmux -y # CentOS 或 Fedora $ sudo yum install tmux -y # Mac $ brew install tmux
三、基本概念
在使用 tmux 之前,先要了解 tmux 中的幾個概念:
-
session(會話):tmux 的架構是由 server 和 client 組成,它們之間透過本地 socket 互動。一個 session 表示一個與 server 的連線,允許任意多個使用者 attach 到這個 session 上,他們將看到完全相同的內容;
-
window(視窗):一個 session 包含任意多個 window,每一個 window 都佔用整個螢幕;
-
pane(子視窗):window 可以被拆分成任意多個子視窗,稱之為 pane,這些 pane 可以水平或垂直分佈。
四、常用命令
1. 基礎命令
(1)檢視 tmux 命令列表
#完整語法:list-commands (lscm) [-F format] #常用形式 tmux lscm
(2)檢視快捷鍵
# 完整語法:list-keys (lsk) [-T key-table] # 常用形式: tmux lsk bind-key -T prefix C-o rotate-window bind-key -T prefix Space next-layout bind-key -T prefix ! break-pane bind-key -T prefix \" split-window bind-key -T prefix % split-window -h bind-key -T prefix 0 select-window -t :=0 bind-key -T prefix 1 select-window -t :=1 bind-key -T prefix 2 select-window -t :=2 bind-key -T prefix 3 select-window -t :=3 bind-key -T prefix 4 select-window -t :=4 bind-key -T prefix 5 select-window -t :=5 bind-key -T prefix 6 select-window -t :=6 bind-key -T prefix 7 select-window -t :=7 bind-key -T prefix 8 select-window -t :=8 bind-key -T prefix 9 select-window -t :=9 bind-key -T prefix : command-prompt bind-key -T prefix \; last-pane bind-key -T prefix ? list-keys bind-key -T prefix D choose-client -Z bind-key -T prefix E select-layout -E bind-key -T prefix L switch-client -l bind-key -T prefix M select-pane -M bind-key -T prefix c new-window bind-key -T prefix d detach-client bind-key -T prefix i display-message bind-key -T prefix l last-window bind-key -T prefix m select-pane -m bind-key -T prefix n next-window bind-key -T prefix o select-pane -t :.+ bind-key -T prefix p previous-window bind-key -T prefix q display-panes bind-key -T prefix r refresh-client bind-key -T prefix s choose-tree -Zs bind-key -T prefix t clock-mode bind-key -T prefix w choose-tree -Zw bind-key -T prefix x confirm-before -p "kill-pane #P? (y/n)" kill-pane bind-key -T prefix z resize-pane -Z bind-key -T prefix \{ swap-pane -U bind-key -T prefix \} swap-pane -D bind-key -T prefix \~ show-messages bind-key -r -T prefix Up select-pane -U bind-key -r -T prefix Down select-pane -D bind-key -r -T prefix Left select-pane -L bind-key -r -T prefix Right select-pane -R bind-key -T prefix M-1 select-layout even-horizontal bind-key -T prefix M-2 select-layout even-vertical bind-key -T prefix M-3 select-layout main-horizontal bind-key -T prefix M-4 select-layout main-vertical bind-key -T prefix M-5 select-layout tiled bind-key -T prefix M-n next-window -a bind-key -T prefix M-o rotate-window -D bind-key -T prefix M-p previous-window -a bind-key -r -T prefix M-Up resize-pane -U 5 bind-key -r -T prefix M-Down resize-pane -D 5 bind-key -r -T prefix M-Left resize-pane -L 5 bind-key -r -T prefix M-Right resize-pane -R 5
(3)快捷鍵的使用
當使用者 attach 到一個 session 後,可以使用快捷鍵簡化操作。tmux 中常用的快捷鍵透過 ctrl+b 觸發。也就說,使用者先按下 ctrl+b,然後鬆開,再其他快捷鍵。
如上一節所示,常見的快捷:
-
0~9 表示選擇 0~9 對應的 window;
-
" 表示水平分隔 window,即將 window 分隔為兩個水平分佈的 pane;
-
% 表示垂直分隔 window。
2. session 相關命令
(1)開啟一個新 session
#完整語法:new-session (new) [-AdDEPX] [-c start-directory] [-F format] [-n window-name] [-s session-name] [-t target-session] [-x width] [-y height] [command] #常用形式 tmux new -n <window-name> -s <session-name> # 或 開啟匿名session tmux
(2)檢視存活的 session 列表
# 完整語法:list-sessions (ls) [-F format] # 常用形式 tmux ls
(3)關聯一個 session
# 完整語法:attach-session (attach) [-dErx] [-c working-directory] [-t target-session] # 常用形式 tmux attach -t <sesion>
(4)分離一個 session
#完整語法:detach-client (detach) [-aP] [-E shell-command] [-s target-session] [-t target-client] #常用形式 tmux detach
(5)停止一個 session
-
當 attach 到一個 session 之後,在 session 在視窗中執行 exit 停止當前 window,當最後一個 window 停止之後,session 自動終止。
-
# kill-session [-aC] [-t target-session] # 常用形式 tmux kill-session -t <session-name>
3. window 相關命令
(1)新建一個 window
# 完整語法:new-window (neww) [-adkP] [-c start-directory] [-e environment] [-F format] [-n window-name] [-t target-window] [command] # 常用形式:tmux neww -t <session-name[:session-index]> -n <window-name>
快捷鍵(ctrl +b):c
(2)退出一個 window
# 完整語法:kill-window (killw) [-a] [-t target-window] # 常用形式: tmux killw -t <window-name or window-index>
快捷鍵(ctrl +b):& 或在 shell 視窗執行:exit。
(3)切換 window
# 完整語法:select-window (selectw) [-lnpT] [-t target-window] # 常用形式 tmux selectw -t <window-name or window-index>
快捷鍵(ctrl +b):0~9
4. pane 相關命令
(1)水平拆分 window(pane)
# 完整語法:split-window (splitw) [-bdefhIPv] [-c start-directory] [-e environment] [-F format] [-p percentage|-l size] [-t target-pane] [command] # 常用形式:tmux splitw -h -t <pane-name>
快捷鍵(ctrl +b):%
注:水平拆分 window 是指拆分後,兩個 pane 水平分佈,即左右各一個視窗。
(2)垂直拆分 window(pane)
# 完整語法:split-window (splitw) [-bdefhIPv] [-c start-directory] [-e environment] [-F format] [-p percentage|-l size] [-t target-pane] [command] # 常用形式:tmux splitw -t <pane-name>
快捷鍵(ctrl +b):"
注:垂直拆分 window 是指拆分後,兩個 pane 垂直分佈,即上下各一個視窗。
(3)檢視 pane 列表
# 完整語法:list-panes (lsp) [-as] [-F format] [-t target-window] # 常用形式:tmux lsp
(4)切換 pane
# 完整語法:select-pane (selectp) [-DdeLlMmRU] [-T title] [-t target-pane] # 常用形式:# 選擇當前 pane 下面的 pane tmux selectp -D # 選擇當前 pane 上面的 pane tmux selectp -U # 選擇當前 pane 左面的 pane tmux selectp -L # 選擇當前 pane 右面的pane tmux selectp -R # 選擇指定名字的 pane tmux selectp -t <pane-name or pane-index>
快捷鍵(ctrl +b):Up、Down、Left、Right
(5)退出 pane
# 完整語法:kill-pane (killp) [-a] [-t target-pane] # 常用形式:tmux killp -t <pane-name or pane-index>
快捷鍵(ctrl +b):x 或在當前 pane 執行:exit。
(6)調整 pane 尺寸
# 完整語法:resize-pane (resizep) [-DLMRUZ] [-x width] [-y height] [-t target-pane] [adjustment] # 常用形式:# 向上調整 tmux resizep -U # 向下調整 tmux resizep -D # 向左調整 tmux resizep -L # 向右調整 tmux resizep -R
快捷鍵:ctl + b + [ Up | Down | Left | Right ]
五、應用場景
1. 後臺保持工作環境(後臺執行程式)
小 A 同學是一名程式設計師, 經常需要在 L inux 伺服器上開發測試程式。他使用 xshell 連線到 L inux 伺服器上,設定自己的工作環境,然後開始自己的工作。有些工作一天做不完,但又不得不在下班時斷開與伺服器的連結,關掉 xshell 視窗,第二天再重新連線 L inux 伺服器,手動恢復前一天的工作環境。特別是有些需要執行時間很長的命令(比如編譯、測試等),也不方便利用晚上下班後的時間。
使用 tmux 可以很好解決上面的問題。 首先,執行 tmux new -t <session-name> 建立一個名稱為 <session-name> 的 session,執行後進入了 tmux 工作 window( 視窗)。接下來,在該視窗中 進行正常 工作,在 tmux 的 window 與普通的 shell 視窗幾乎沒有區別。當結束了一天工作,執行 tmux detach 退出 <session-name>。
第二天,使用 xshell 登入 linux 伺服器,執行 tmux attach -t <session-name> attach 到昨天的 session,此時看到的內容和昨天退出時完全一樣。
另外,還一個小技巧:如果忘了 session-name 還可以透過執行 tmux ls 檢視 session 列表。
2. 多視窗對比
小 A 同學遇到了另外一個問題:在效能測試的時候他想同時看 CPU 實時使用情況、記憶體實時使用情況、實時輸出的日誌以及執行命令視窗。之前的做法是同時開啟多個 xshell 的 tab,然後手動在螢幕上排列對齊。雖然也能解決問題,但很不方便。
如果使用 tmux 的 pane(子視窗)就能完美的解決該問題。 首先, attach 到 tmux 視窗,此時看到的是一個視窗佔據了整個螢幕 ; 接著, 執行 tmux splitw [-h] 或者快捷鍵 ctrl+b # 或/"分隔視窗。重複上述步驟,可以得到任意多的子視窗(pane)。
接下來,透過快捷鍵 ctrl+b Up/Down/Left/Right 在各子視窗之間切換,在各子視窗中進行不同的工作,比如右上視窗用 nomn 監視 CPU,右下視窗用 nmon 監視記憶體,左下視窗監視日誌,左上視窗執行命令。
3. 協作開發
小 B 同學是小 A 同學的同事,是公司裡的技術大牛。這次小 A 同學遇到了一個 bug,百思不得其解,就去請大牛小 B 同學幫忙。小 B 同學使用相同的 L inux 使用者登入到 L inux 伺服器,然後 attach 到小 A 的 session,切換到小 A 正在使用的視窗。開始在視窗中瘋狂地敲入各種命令,很快 bug 解決了。整個除錯過程小 A 在他的電腦螢幕上都可以看到,因為同一個 session 的視窗在各個使用者之間實時共享的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70027415/viewspace-2986472/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一文帶你走進得物影片
- 帶你走進 RedisRedis
- 帶你走進靈動島
- 帶你走進Java集合之ConcurrentHashMapJavaHashMap
- 帶你走進Java集合之HashMapJavaHashMap
- 帶你走進Java集合之ArrayListJava
- 帶你走進CSS定位詳解CSS
- 一文帶你入門LinuxLinux
- 帶你走進零知識證明
- APISpace 帶你一起走進西湖美景API
- 帶你走進webpack世界,成為webpack頭號玩家。Web
- 帶你走進神一樣的Elasticsearch索引機制Elasticsearch索引
- 帶你走進Choerodon豬齒魚的知識管理
- 手把手帶你走進Babel的編譯世界Babel編譯
- 帶你走進MySQL全新高可用解決方案-MGRMySql
- 還不懂什麼是“立回”、“對空”? 一文帶你走進格鬥遊戲的世界遊戲
- 視覺化,帶你走進“真實”的虛擬世界視覺化虛擬世界
- 實在智慧RPA帶你走進企業數字化
- CSS基本知識點——帶你走進CSS的新世界CSS
- 帶你走進memcache,老牌記憶體快取技術記憶體快取
- 六個學習方法帶你走進學習狀態
- 帶你走進 HarmonyOS:前端如何迎接新技術的到來前端
- 一文帶你帶你瞭解企業如何有效推進ERP系統的實施?
- 【進階1-4期】JavaScript深入之帶你走進記憶體機制JavaScript記憶體
- 從零認識webpack4.0,帶你走進神祕的webpackWeb
- 實在智慧RPA機器人帶你走進元宇宙的殿堂機器人元宇宙
- 百元入帶屏智慧顯微鏡 帶你走進放大800倍的世界
- 一文帶你搞懂 SSR
- 一文帶你搞懂RPCRPC
- 一文帶你瞭解Linux軟連結與硬連結!Linux
- 【思前享後】一個故事帶你走進區塊鏈的世界!!!區塊鏈
- 一文帶你快速掌握AQSAQS
- 一文帶你學習SpringBootSpring Boot
- 一文帶你入門TransformerORM
- 一文帶你搞定AOP切面
- 一文帶你瞭解 chatgptChatGPT
- 一文帶你入門 GolangGolang
- 一文帶你認識DockerDocker