转载备注:
作者主页:薰衣草的旋律
博客地址:https://www.cnblogs.com/wangqiguo/p/8905081.html
一、tmux 是什么
我们在 linux 服务器上的工作一般都是通过一个远程的终端连接软件连接到远端系统进行操作,例如使用 xshell 或者 SecureCRT 工具通过 ssh 进行远程连接。在使用过程中,如果要做比较耗时的操作,例如有时候进行编译,或者下载大文件需要比较长的时间,一般情况下是下班之后直接运行希望第二天早上过来运行完成,这样就不用耽误工作时间。但是网络有时候不稳定,可能在半夜会出现连接断掉的情况,一旦连接断掉,我们所执行的程序也就中断,我们当然可以写一个脚本后台运行,但是还是不方便。那么有没有一种工具可以解决这样的问题呢。
这就是我们这里要提到的 tmux 了。其实类似 tmux 的工具还有很多。例如 gnu screen 等。tmux 刚好可以解决我们描述的问题,当我们在 tmux 中工作的时候,即使关掉 SecureCRT 的连接窗口,再次连接,进入 tmux 的会话我们之前的工作仍然在继续。
tmux 是一个 linux 下面的工具,在使用之前需要安装,就像安装 linux 下的其他工具一样方便。首先我们通过 SecureCRT 连接登入远程的 linux 机器,我们将此时的环境称为终端环境。如果这个机器上并没有安装 tmux,我们需要安装。例如在 CentOs 上是 yum install tmux,完成之后我们就可以使用 tmux 命令了。
tmux 中有 3 种概念,会话,窗口 (window),窗格 (pane)。会话有点像是 tmux 的服务,在后端运行,我们可以通过 tmux 命令创建这种服务,并且可以通过 tmux 命令查看,附加到后端运行的会话中。一个会话可以包含多个窗口,一个窗口可以被分割成多个窗格 (pane)。首先我们来看一下 tmux 的会话。
二、tmux 的会话
1. tmux new -s session1 新建会话
使用 tmux new -s 命令新建一个会话 -s (其实是 session 的头字母)。后面指定会话名即可。运行之后会从 shell 的终端环境进入到会话环境中,并停留在刚才新建的会话中。例如:
可以看到进入 session 之后的显示,在下面有一条绿色的状态指示栏,左边显示的是当前会话的名字,紧接着是会话中的窗口 (window) 序号以及窗口名字。关于窗口的概念我们后面再说,窗口名字后面有一个星号 * 表示是我们操作的当前窗口,一个会话中可以有多个窗口。当进入一个会话之后,会自动创建一个窗口。如上图所示,上面的环境在本章中称为会话环境。这样我们就已经开始了 tmux 的使用,如果此时关闭掉 SecureCRT 软件,下次在进入,该会话仍然在运行工。也就是说我们在刚刚进入的会话环境中使用 wget 下载一个超大的文件,或者是编译一个非常耗时的项目,我们关闭掉该 SecureCRT 的连接,下次再进入,这个会话依然存在,会话里面运行的编译命令或者 wget 下载命令仍然在运行,并不会因为关闭 SecureCRT 而终止,这正是我们需要的功能。不受 SecureCRT 网络连接的影响。甚至我们可以关掉整个 SecureCRT 程序。
2. ctrl+b d 退出会话,回到 shell 的终端环境
我们刚才是通过 tmux new -s 命令创建一个 tmux 会话并进入该会话的,如果要退出这个会话环境回到终端环境 (会话里面的程序不会退出在后台保持继续运行)。应该如何操作呢,例如上图,当前我们在 tmux 的会话环境中,使用一个快捷键 ctrl+b d (按 ctrl+b 之后再按一个字母 d 即可,字母 d 是 detach 的缩写)。操作之后的结果如下:
可以看到绿色的状态栏消失了,而顶部出现一个 [detached],表示已经脱离 tmux 会话,现在已经不在 tmux 的会话环境中回到 shell 终端环境中了。
这里有必要说一下在 tmux 会话环境中,我们经常会用到 tmux 的组合键,一般的组合键中都会加一个前缀也就是 ctrl+b 另外,在后面的描述中,我们说的终端环境是指使用 SecureCRT 进入远程 linux 之后但是没有进入 tmux 的会话环境的状态。
通过上面的操作 ctrl+b d 之后,回到终端环境,实际上现在 tmux 的会话还在后台运行,如何查看呢。
3. tmux ls 终端环境查看会话列表
在终端环境中,我们可以通过 tmux ls 命令来查看后台运行中的 tmux 的会话列表,例如:
可以看到在列出的列表中,只有 1 行,说明只有一个 session,其中左边的 session1 表示该 session 的名字,中间 2 windows 说明该 session1 会话中有 2 个 window,右边表示该会话创建的时间。如果该机器中有多个 tmux 会话在后台运行,那么这里会列出多行。因为 tmux 会话在后台运行,我们猜测实际上肯定是有 tmux 的进程在后台运行来维持这些会话。我们可以 ps 看一下:
可以看到我们之前创建会话的命令还在后端运行。
4. ctrl+b s 会话环境查看会话列表
上面的命令中我们已经退出了 tmux 的会话环境,在终端环境中通过 tmux ls 来列出当前 linux 机器后台运行的 tmux 会话列表。那么假设我们当前环境已经在 tmux 的会话环境中,我们如何得到当前 tmux 的会话列表呢,如果每次都要退出当前会话,先回到 shell 终端环境再运行 tmux ls 来查看就很不方便,那么在 tmux 的会话环境中,我们可以通过 ctrl+b s 来获取当前 linux 机器上 tmux 所有的后台会话列表,例如操作之后显示如下:
此时可以通过方向键选择会话并回车,在会话间进行切换。
5. tmux a -t session1 从终端环境进入会话
如果在终端环境中运行 tmux ls 查看有 tmux 会话正在后台运行,如何进入到该正在后台中运行的会话呢,通过运行 tmux a -t session1 即可进入到该已存在的会话 session1 中。其中 a 字母是 attach 的头字母,表示附加, -t 指定要进入已存在的会话名,如果不存在则会报告 session not found 错误。
6. tmux kill-session -t session1 销毁会话
我们可以在终端环境和会话环境中销毁会话,例如在终端环境中运行 tmux kill-session -t session1 结束名字为 session1 的 tmux 会话。
在会话环境中运行 ctrl+b :
(注意按组合键之后再按一个冒号键),状态栏变成黄色之后提示我们可以在会话环境中输入命令,此时输入 kill-session -t session1 回车即可。其中 session1 是要销毁的会话名。
会话销毁之后,在终端环境中运行 tmux ls 或者在会话环境中运行 ctrl+b s 则被销毁的会话不会再出现在会话列表中。
7. tmux rename -t old_session_name new_session_name 重命名会话
我们可以在终端环境中将会话重命名,如上面的命令,重命名之后通过 tmux ls 命令在终端环境中看到的列表中会显示会话的新名称。
8. ctrl + b $ 重命名会话 (在会话环境中)
在会话环境中,我们可以通过前缀命令加上 $ 的组合来重命名当前打开的会话的名字
三、tmux 的 window
一个 tmux 的会话中可以有多个窗口 (window),每个窗口又可以分割成多个 pane(窗格)。我们工作的最小单位其实是窗格。默认情况下在一个 window 中,只有一个大窗格,占满整个窗口区域。我们在这个区域工作。
本节我们讲解一下 tmux 窗口的相关操作,后面我们再说一下关于窗格 (pane) 的相关知识。首先在新创建的一个会话里面是会默认创建一个窗口的。正如我们上面提到过的图一样,如下所示:
新创建的会话中会默认创建一个窗口,该窗口名字一般是登陆终端的用户名 @主机名,我们可以通过 crtl+b ,
(组合键之后按一个逗号) 来修改当前窗口的名字,如上图所示的窗口名字 myserver1 就是修改之后的名字。该名字后面有一个 * 号,表示该窗口是活动窗口 (键盘输入会输入到该窗口中)
1. 创建 window
可以在当前会话窗口中创建多个窗口,例如 ctrl+b c 创建之后会多出一个窗口如下图所示:
默认情况下创建出来的窗口由窗口序号 + 窗口名字组成,窗口名字可以由上面提到的方法修改,可以看到新创建的窗口后面有 * 号,表示是当前窗口。
2. 切换 window
在同一个会话的多个窗口之间可以通过如下快捷键进行切换:
ctrl+b p (previous 的首字母) 切换到上一个 window。
ctrl+b n (next 的首字母) 切换到下一个 window。
ctrl+b 0 切换到 0 号 window,依次类推,可换成任意窗口序号
ctrl+b w (windows 的首字母) 列出当前 session 所有 window,通过上、下键切换窗口
ctrl+b l (字母 L 的小写) 相邻的 window 切换
3. ctrl+b & 关闭 window
ctrl+b & 关闭当前 window,会给出提示是否关闭当前窗口,按下 y 确认即可。
四、tmux 的 pane
tmux 的一个窗口可以被分成多个 pane(窗格),可以做出分屏的效果。
1. ctrl+b % 垂直分屏 (组合键之后按一个百分号),用一条垂线把当前窗口分成左右两屏。
2. ctrl+b " 水平分屏 (组合键之后按一个双引号),用一条水平线把当前窗口分成上下两屏。
分屏之后光标停留在哪个 pane 上,表示该 pane 是活动的,另外一般情况下当前 pane 会被绿色的线条围起来。一般分屏之后当前窗口名字会重置为默认窗口名字。通过多次分屏操作,我们可以得到各种样子的分屏效果,例如下图显示的是一次垂直分屏之后,在右边 pane 中再次水平分屏的效果:
可以看到右下角的分屏是绿色框,说明是当前活动 pane
3. 切换 pane
ctrl+b o 依次切换当前窗口下的各个 pane。
ctrl+b Up|Down|Left|Right 根据按箭方向选择切换到某个 pane。
ctrl+b Space (空格键) 对当前窗口下的所有 pane 重新排列布局,每按一次,换一种样式。
ctrl+b z 最大化当前 pane。再按一次后恢复。
4. 关闭 pane
ctrl+b x 关闭当前使用中的 pane,操作之后会给出是否关闭的提示,按 y 确认即关闭。
五、tmux window 中的历史输出查看
在 tmux 里面,因为每个窗口 (tmux window) 的历史内容已经被 tmux 接管了,当我们在每个 tmux 的 window 之间进行来回切换,来回操作,那么我们没有办法看到一个 window 里面屏幕上的历史输出。没办法使用鼠标滚动 (例如在 SecureCRT 中) 查看之前的内容,在 SecureCRT 中通过鼠标滚动看到的输出一定是各个 tmux 的 window 的输出混乱夹杂在一起的,如果要看当前窗口的历史内容,那么应该怎么办呢,通过在当前的 tmux window 按 ctrl-b 进入 copy mode,然后就可以用 PgUp/PgDn 来浏览历史输出了,按 q 退出。
六、总结
tmux 中的最重要的三个概念会话,窗口,pane 的使用方法已经介绍完毕,其实这是我们操作 tmux 的最常用功能,如果掌握好,足以应付大多数工作。另外 tmux 还有一些高级用法,例如可以个性化的配置其组合键 (官方默认的 ctrl+b 组合键按起来不太方便可以修改,UI 设置,鼠标支持,复制粘贴等),但是我觉得这些高级功能基本不太用的到。如有需要大家可以自行查阅相关资料。