1. 程式人生 > >終端複用工具 tmux 簡單操作記錄

終端複用工具 tmux 簡單操作記錄

簡介

  在 Linux 操作環境下,終端操作是發揮 Linux 強大命令功能的重要途徑,但在本地主機操作中,針對不同任務開啟不同的終端,在使用時進行頻繁的終端切換在某些場合下是一種使人分心和疲憊的操作,而通過遠端登入使用遠端伺服器的功能時, ssh 等遠端登入服務提供的單一終端時常不能滿足正常的使用需求,而且單一終端上執行的任務也會受到 ssh 連線斷開等意外狀況的影響,如由於遠端登入斷開使得終端上執行的任務也直接停止等。本文主要記錄一種 Linux 平臺下進行終端複用的工具 tmux,其可以在單一的終端上實現多工管理,通過簡單的操作進行任務之間的切換,且任務的執行不受終端退出等意外情況的影響。

  在 tmux 環境下,使用者主要通過會話( session )來管理多個不同任務的終端介面控制,其中,每個會話可以擁有多個視窗( window )用於相關任務的顯示,每個視窗則可以進一步被劃分為多個面板( pane )每一個面板為一個獨立的偽終端,從而在單一的終端命令中實現終端複用,即使當前終端退出登入,只要會話不被登出,會話中相關的任務就會繼續得到執行。

   本文主要記錄在常規使用過程中常用的 tmux 功能按鍵和操作,以供備忘和參考。

 

tmux 安裝

  在具備 root 或 sudo 許可權的個人機器上,使用者可通過系統自帶的包管理工具安裝 tmux ,如 Ubuntu 環境下可通過 apt 安裝。

    sudo apt install tmux    //Ubuntu 環境下通過 apt 安裝 tmux

  在不具備 root 許可權的遠端伺服器上,一般通過原始碼編譯的方式將使用者所需的應用程式、so庫等放置在使用者的主目錄下,在編譯時需要通過編譯指令指定編譯所需的標頭檔案、so庫檔案的存放位置。同時,在使用原始碼編譯時,使用者需要自行解決不同軟體之間的依賴關係,只有將某一程式所需的所有依賴程式均安裝成功後,最後才能順利安裝該軟體。關於原始碼安裝的簡單原理可以參考筆者的記錄在遠端登陸的主機上通過命令列原始碼編譯安裝 GNU M4、autoconf、automake 等程式

.

 

基本按鍵

  在原始的 shell 環境下,一般通過 tmux [ action ][ args ] 的命令列方式啟動和使用 tmux。而在 tmux 的( 會話 )介面中,其主要的功能均通過 <prefix> + 功能鍵 的按鍵操作來實現,從而避免與其他系統按鍵之間的衝突,預設條件下,tmux 設定的 <prefix> 為 Ctrl + b,即使用者在使用 tmux 時,可先按 Ctrl + b ,再按對應功能鍵使用對應的功能。

   tmux [ action ][ args ]     //原始終端中啟動和使用 tmux
    <prefix> 功能鍵          //通過 <prefix> 功能鍵 的按鍵操作使用 tmux 的功能,tmux 預設 prefix 為 Ctrl + b

  下文關於會話中功能鍵的介紹記錄的是使用者在已經按下 <prefix> 鍵後,使用不同功能所需進一步按下的功能鍵

 

會話管理

  通過 ssh 遠端登入至遠端伺服器或簡單的開啟命令列終端時, 可供使用者使用的操作工具僅為單一的終端視窗。tmux 使用會話( session )的概念在單一終端視窗上實現終端複用,使用者可在不同會話中管理不同的任務,不同會話之間相互不產生干擾。使用者可自由的進行會話的建立和銷燬,進入( attach )和脫離( detach )會話等操作。

  建立會話

  使用者通過 tmux 命令建立一個新的會話。不指定引數時,tmux 建立一個擁有單一視窗(名為 bash )的預設會話(名為 1 )。此時即已進入 tmux 建立的會話中,螢幕的左下角標記當前所處的會話和視窗名。

    tmux [ new -s session_name -n window_name ]    //建立並進入一個名為 session_name 的會話,其擁有一個名為 window_name 的視窗 

  例:使用者可通過以下命令建立一個名為 yh 的會話,其擁有一個名為 yh 的視窗,在 tmux 建立的會話環境下,螢幕的左下角提示當前的會話和視窗資訊,* 表示當前所在的視窗。

      

  離開會話

  在 tmux 提供的會話環境下,使用者可通過 <prefix> + d 脫離 tmux 的會話,回到原始的 shell 終端介面。上述離開過程稱為 detach ,對應的會話實際上一直在後臺執行,而不受其他操作( 如遠端登入斷開 )的影響。

    d        //在 tmux 會話中,通過 <prefix> + d 返回原始 shell 終端

  或者直接在當前會話提供的終端中輸入 tmux detach

    tmux detach    //退出當前的會話

  查詢會話

  在原始的 shell 終端介面,可通過 tmux ls 命令查詢目前存在的會話。

    tmux ls        //顯示當前存在的所有會話

  進入會話

  當用戶離開( detach )某個會話後,該會話實際會在後臺執行而不是被登出,可通過 tmux attach 命令重新進入某個會話。在不指定 -t 引數時,預設進入的是使用者最近離開的會話。

    tmux attach [ -t session_name ]    //進入一個名為 session_name 的會話中,命令中可使用 attach、at 或 a

  登出會話

  可通過命令列方式即 tmux kill-session 命令刪除某個會話。可通過 kill-server 命令刪除所有的會話。上述命令在 tmux 會話或原始終端中均有效。

    tmux kill-session -t session-name   //刪除名為 session-name 的會話
    tmux kill-server    //刪除所有的會話

  基本原理

  在 tmux 實現中,會話實際由 tmux 客戶端( client )顯示在螢幕上,而所有的會話均由一個唯一的 tmux 伺服器( server )進行管理,當用戶建立第一個 tmux 會話時,tmux server 即啟動,而當所有的會話都被登出時,tmux server 則自動停止,從而退出 tmux。tmux client 和 server 均為獨立的程序,它們之間通過一個位於 /tmp 目錄下的 socket 進行互動。當用戶從原始的終端通過 tmux 命令建立一個會話或重新 attach 一個會話時,tmux 即在當前終端下建立一個 tmux client,用於顯示進入的 tmux 會話,當用戶在 tmux 中進行會話切換時,實際是將當前的 tmux client 重新 attach 到新的會話中( 從而顯示新的會話 ),而當用戶選擇 detach 當前會話時,實際是取消 tmux client 與當前會話的繫結( 從而不再顯示該會話 ),無論是上述哪一種情況,實際上只是 tmux client 不再顯示某一個會話,而不是關閉會話,會話仍會在後臺執行,由 tmux server 進行管理。當從 tmux 退出至原始的終端時,該終端下建立的 tmux client 即自動退出。

  

視窗管理

  進入 tmux 的會話後,使用者實際處於當前會話的一個視窗中,一個會話( session )可以擁有多個視窗( window ),一個視窗則可以進一步被劃分為更小的面板( pane ).使用者可在視窗下直接進行會話管理,視窗管理以及對視窗的進一步劃分等操作。在 tmux 視窗下的各種功能一般通過 <prefix> + 功能鍵 的按鍵操作方式使用。

  會話管理

  使用者可在 tmux 提供的介面中通過 < prefix > + 功能鍵 的方式進行會話切換,退出會話從而返回原始的 shell 終端等操作。

    d        //退出當前會話
    s        //列出所有會話,通過 j 和 k ( ↑ 和 ↓ )進行上下選擇,通過回車確定切換至該會話
    
    D       //選擇一個會話來
    (       //切換 attached client 至前一個 session//切換 attached client 至後一個 session
    $        //重新命名當前會話

 

  視窗管理

   每個會話可擁有多個不同的視窗,使用者可通過 tmux 進行視窗的建立、銷燬和切換等操作。

    c        //新建一個視窗
    &        //刪除當前視窗,會提示通過 y/n 進行確認
    n        //切換至下一視窗
    p        //切換至前一視窗
    0-9    //切換至數字索引對應的視窗
   ,     //重新命名當前視窗

 

面板管理

  在 tmux 提供的會話視窗中,每一個視窗可以被進一步被劃分為不同的面板,每一面板為一個獨立的偽終端,可進行獨立的操作。

    "        //將當前視窗(面板)劃分為上下兩部分
    %       //將當前視窗(面板)劃分為左右兩部分
    x        //關閉當前的面板
    !        //將當前視窗(面板)單獨作為一個視窗獨立顯示出來
    o        //在當前視窗的不同面板間進行切換
    Ctrl + o    //逆時針旋轉當前的面板佈局,即不同的面板逆時針切換至其逆時針相鄰的面板的位置
    Ctrl + ↑/↓/←/→    //調整當前面板的大小,每次大小改變1個 cell
    Alt + ↑/↓/←/→     //調整當前面板的大小,每次大小改變5個 cell

 

命令操作

  在 tmux 中,也可以通過命令的方式進行會話、視窗和麵板的管理。使用者可通過 < prefix > + : 調出 tmux 的指令提示符,進而可以直接使用 tmux 支援的命令進行管理。

    :            //通過 < prefix > + : 調出 tmux 命令提示符,使用者可在其中執行 tmux 支援的指令

  下面介紹一些簡單的 tmux 支援的命令,更多的命令使用者可通過 man tmux 檢視 tmux 的使用說明。

    new [ -s session_name ]        //新建一個會話,可通過 -s 指定會話名,完整命令名為 new-session
    attach [ -t session_name ]     //將當前的 client 與指定的 session 繫結,從而顯示新會話的內容,完整命令名為 attach-session
    detach [ -s target_session ][ -t target_client ]    //將與 -s 指定的session 繫結的 tmux client 解除繫結,或將 -t 指定的終端解除與會話的繫結,完整的命令名為 detach-client
    kill-session  [ -t session_name ]            //結束某個會話( session )
    list-clients                        //顯示當前所有的 tmux client
    list-sessions                        //顯示所有 tmux server 管理的會話( session )        

 

  實際上 tmux 提供強大的拓展功能,這裡僅記錄最基本的終端複用時的常用操作,更炫酷的效果是使用 tmux 實現將單一終端佈局為類似整合開發環境的效果,有意者可以參考本文的參考資料和網路資料。

參考資料: 

  Tmux 說明文件: man tmux

  Tmux 快捷鍵 & 速查表:https://gist.github.com/ryerh/14b7c24dfd623ef8edc7

  Tmux 速成教程:技巧和調整:https://linux.cn/article-5666-1.html

  Tmux使用手冊:http://louiszhai.github.io/2017/09/30/tmux/

  Linux下終端利器tmux:http://kumu-linux.github.io/blog/2013/08/06/tmux/

  tmux 指南:https://wdxtub.com/2016/03/30/tmux-guide/

  優雅地使用命令列:Tmux 終端複用:https://harttle.land/2015/11/06/tmux-startup.html