在 Linux 操作环境下,终端操作是发挥 Linux 强大命令功能的重要途径,但在本地主机操作中,针对不同任务开启不同的终端,在使用时进行频繁的终端切换在某些场合下是一种使人分心和疲惫的操作,而通过远程登录使用远端服务器的功能时, ssh 等远程登录服务提供的单一终端时常不能满足正常的使用需求,而且单一终端上执行的任务也会受到 ssh 连接断开等意外状况的影响,如由于远程登录断开使得终端上执行的任务也直接停止等。本文主要记录一种 Linux 平台下进行终端复用的工具 tmux,其可以在单一的终端上实现多任务管理,通过简单的操作进行任务之间的切换,且任务的执行不受终端退出等意外情况的影响。

  在 tmux 环境下,用户主要通过会话( session )来管理多个不同任务的终端界面控制,其中,每个会话可以拥有多个窗口( window )用于相关任务的显示,每个窗口则可以进一步被划分为多个面板( pane )每一个面板为一个独立的伪终端,从而在单一的终端命令中实现终端复用,即使当前终端退出登录,只要会话不被注销,会话中相关的任务就会继续得到执行。

   本文主要记录在常规使用过程中常用的 tmux 功能按键和操作,以供备忘和参考。

  (另注:一般在服务器环境下,通过源码编译安装 tmux 的过程是比较繁琐的,故而在服务器端想要使用这样的工具并不容易,更好的选择是一般的 linux 服务器会提供的 screen 命令,其简单用法可见笔者的另一篇博文。) 

  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 的窗口,注注意 new 对应的是新建的含义 

  例:用户可通过以下命令创建一个名为 yh 的会话,其拥有一个名为 yh 的窗口,在 tmux 创建的会话环境下,屏幕的左下角提示当前的会话和窗口信息,* 表示当前所在的窗口。

  终端分屏复用工具 tmux 基本操作教程-冯金伟博客园    终端分屏复用工具 tmux 基本操作教程-冯金伟博客园

  离开会话

  在 tmux 提供的会话环境下,用户可通过 <prefix> + d 脱离 tmux 的会话,回到原始的 shell 终端界面。上述离开过程称为 detach ,对应的会话实际上一直在后台运行,而不受其他操作( 如远程登录断开 )的影响。

    d        //在 tmux 会话中,通过 <prefix> + d 返回原始 shell 终端

  或者直接在当前会话提供的终端中输入 tmux detach

    tmux detach    //退出当前的会话

  查询会话

  用户可通过通过输入命令 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 提供的会话窗口中,每一个窗口可以被进一步被划分为不同的面板,每一面板为一个独立的伪终端,可进行独立的操作。进行操作的快捷键同样为 < prefix > + 功能键。

    "        //将当前窗口(面板)划分为上下两部分
    %       //将当前窗口(面板)划分为左右两部分
    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