什么是tmux
我们在Linux服务器上的工作一般都是通过一个远程的终端连接软件连接到远端系统进行操作,例如使用xshell或者Xshell工具通过ssh进行远程连接。在使用过程中,如果要做比较耗时的操作,例如有时候进行编译,或者下载大文件需要比较长的时间,一般情况下是下班之后直接运行希望第二天早上过来运行完成,这样就不用耽误工作时间。但是网络有时候不稳定,可能在半夜会出现连接断掉的情况,一旦连接断掉,我们所执行的程序也就中断,我们当然可以写一个脚本后台运行,但是还是不方便。那么有没有一种工具可以解决这样的问题呢。这就是我们这里要提到的tmux了。其实类似tmux的工具还有很多。例如gnu screen等。tmux刚好可以解决我们描述的问题,当我们在tmux中工作的时候,即使关掉Xshell的连接窗口,再次连接,进入tmux的会话我们之前的工作仍然在继续。
tmux是一个Linux下面的工具,在使用之前需要安装,就像安装Linux下的其他工具一样方便。首先我们通过xshell连接登入远程的linux机器,我们将此时的环境称为终端环境。如果这个机器上并没有安装tmux,我们需要安装。例如在CentOS上是yum install tmux,完成之后我们就可以使用tmux命令了。tmux中有3种概念,会话,窗口(window),窗格(pane)。会话有点像是tmux的服务,在后端运行,我们可以通过tmux命令创建这种服务,并且可以通过tmux命令查看,附加到后端运行的会话中。一个会话可以包含多个窗口,一个窗口可以被分割成多个窗格(pane)
安装tmux
[root@localhost ~]# yum -y install tmux
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Resolving Dependencies
--> Running transaction check
---> Package tmux.x86_64 0:1.8-4.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
=======================================================================================================================================================================
Package Arch Version Repository Size
=======================================================================================================================================================================
Installing:
tmux x86_64 1.8-4.el7 base 243 k
Transaction Summary
=======================================================================================================================================================================
Install 1 Package
Total download size: 243 k
Installed size: 558 k
Downloading packages:
tmux-1.8-4.el7.x86_64.rpm | 243 kB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : tmux-1.8-4.el7.x86_64 1/1
Verifying : tmux-1.8-4.el7.x86_64 1/1
Installed:
tmux.x86_64 0:1.8-4.el7
Complete!
tmux会话
创建会话
语法:
tmux new -s session-name
使用 tmux new -s 命令新建一个会话 -s (其实是session的头字母)。后面指定会话名即可。运行之后会从shell的终端环境进入到会话环境中,并停留在刚才新建的会话中,可以看到进入session之后的显示,在下面有一条绿色的状态指示栏,左边显示的是当前会话的名字,紧接着是会话中的窗口(window)序号以及窗口名字。关于窗口的概念我们后面再说,窗口名字后面有一个星号*表示是我们操作的当前窗口,一个会话中可以有多个窗口。当进入一个会话之后,会自动创建一个窗口。如上图所示,上面的环境在本章中称为会话环境。这样我们就已经开始了tmux的使用,如果此时关闭掉Xshell软件,下次在进入,该会话仍然在运行工。也就是说我们在刚刚进入的会话环境中使用wget下载一个超大的文件,或者是编译一个非常耗时的项目,我们关闭掉该Xshell的连接,下次再进入,这个会话依然存在,会话里面运行的编译命令或者wget下载命令仍然在运行,并不会因为关闭Xshell而终止,这正是我们需要的功能。不受Xshell网络连接的影响。甚至我们可以关掉整个Xshell程序。
例1:
创建会话compile-python
[root@localhost ~]# tmux new -s compile-python # compile-python是session名
退出会话
快捷键:
Ctrl + b d
说明:按完Ctrl + b 组合键后,按d
我们刚才是通过 tmux new -s 命令创建一个tmux会话并进入该会话的,如果要退出这个会话环境回到终端环境(会话里面的程序不会退出在后台保持继续运行)。应该如何操作呢,例如上图,当前我们在tmux的会话环境中,使用一个快捷键 ctrl+b+d
(按ctrl+b 之后再按一个字母d即可,字母d是detach的缩写)。可以看到绿色的状态栏消失了,而顶部出现一个[detached],表示已经脱离tmux会话,现在已经不在tmux的会话环境中回到shell终端环境中了。
这里有必要说一下在tmux会话环境中,我们经常会用到tmux的组合键,一般的组合键中都会加一个前缀也就是 ctrl+b 另外,在后面的描述中,我们说的终端环境是指使用Xshell进入远程linux之后但是没有进入tmux的会话环境的状态。
通过上面的操作 ctrl+b d 之后,回到终端环境,实际上现在tmux的会话还在后台运行,如何查看呢。
例1:
查看tmux会话列表
在终端环境中,我们可以通过tmux ls 命令来查看后台运行中的tmux的会话列表
语法:
tmux ls
例1:
可以看到在列出的列表中,有3行,说明只有三个session,其中冒号左边的表示该session的名字,中间1 windows说明该session1会话中有1个window,括号中表示该会话创建的时间。如果该机器中有多个tmux会话在后台运行,那么这里会列出多行。因为tmux会话在后台运行,我们猜测实际上肯定是有tmux的进程在后台运行来维持这些会话。
重新进入会话
语法:
tmux a -t session-name
说明:字母a
是attach的头字母,表示附加, -t 指定要进入已存在的会话名,如果不存在则会报告 session not found 错误。
在会话环境中,查看会话列表
快捷键:
Ctrl + b s
在列表中,我们可以通过方向键选择会话,回车后即可以切换到该会话中
销毁会话
在终端结束会话
语法:
tmux kill-session -t session-name
在会话中结束会话:
方式一:
快捷键:
Ctrl + d
方式二:
命令:exit
方式三:
快捷键:
Ctrl + b :
Ctrl + b 然后输入冒号( :), 底部的绿色条会变成黄色,输入kill-session
然后回车
例1:
按方式一结束会话
进入compile-ngix会话,按Ctrl + d结束会话
例2:
按方式二结束会话
例3:
按方式三结束会话
# 先进入该会话
#输入Ctrl + b 和冒号,等底部变成黄色后,输入kill-session
重命名会话
方式一:在终端环境中
语法:
tmux rename -t old_session_name new_session_name
方式二:在会话中
快捷键:
Ctrl + b $
例1:
用方式一进行重命名
从下图中可以看到我们将compile-python
该为了session1-python
例2:
用方式二进行重命名
# 修改前
# 修改中
# 修改前后查看
tmux窗口
创建新窗口
快捷键:
Ctrl + b c
默认我们创建tmux会话回创建一个窗口,窗口编号从0开始,Ctrl + b c会在会话中,重新创建一个窗口, 当前激活的窗口后面会有一个星号,入下图中新建窗口1,后面有个星号
例1:
窗口切换
快捷键:
快捷键 | 说明 |
---|---|
Ctrl + b p |
切换到上一个窗口 (p可以理解为previous的首字母) |
Ctrl + b n |
切换到下一个窗口 (n可以理解为next的首字母) |
Ctrl + b 0 |
切换到0号窗口,依次类推,可以缓存任意窗口序号 |
Ctrl + b w |
列出当前session所有window,通过上、下键切换窗口(w可以理解为windows的首字母) |
Ctrl + b l |
(字母L的小写)相邻的window切换 |
给窗口改名
快捷键:
Ctrl + b ,
修改窗口的名称可以通过Ctrl + b 再加逗号来进行,在输入快捷键后,底部绿色背景会变成黄色,修改完毕后直接回车即可。如果要给其他窗口修改,需要先切换窗口,然后再进行修改
例1:
修改新创建的1号窗口为new_windows
# 输入快捷键后
关闭窗口
快捷键:
Ctrl + b &
关闭当前window,执行快捷键后,会给出提示是否关闭当前窗口,按下y确认即可
例1:
tmux窗格
tmux的一个窗口可以被分成多个pane(窗格),可以做出分屏的效果(相当于Sxhell复制了一个终端,再该窗格中进行的一些划分,不影响另一个窗格),分屏之后光标停留在哪个pane上,表示该pane是活动的,一般分屏之后当前窗口名字会重置为默认窗口名字(即修改名字之前的名字)
左右分屏(垂直分屏)
快捷键:
Ctrl + b %
此快捷键用于将屏幕分成左右的两个屏
上下分屏(水平分屏)
快捷键:
Ctrl + b "
后面接的是一个双引号
例1:
多次分屏效果
例1:
先垂直分屏,然后再水平分屏,再垂直分屏,经过多次分屏,展现效果如下,需要注意的是,这些都是在win01这个窗格里面进行的操作,如果切换了windows,则win02中是没有这些的,当然没进行一下分屏,重命名的名字都会重置
关闭分屏
快捷键:
Ctrl + b x
关闭分配不会影响重命名,之前的重命名依然有效
例1:
删除了一个垂直分屏
常用快捷键汇总:
Ctrl + b | 描述 | |
---|---|---|
系统操作 | ? | 列出所有快捷键;按q返回 |
d | 脱离当前会话;这样可以暂时返回Shell界面,输入tmux attach能够重新进入之前的会话 | |
D | 选择要脱离的会话;在同时开启了多个会话时使用 | |
Ctrl+z | 挂起当前会话 | |
r | 强制重绘未脱离的会话 | |
s | 选择并切换会话;在同时开启了多个会话时使用 | |
: | 进入命令行模式;此时可以输入支持的命令,例如kill-server可以关闭服务器 | |
[ | 进入复制模式;此时的操作与vi/emacs相同,按q/Esc退出 | |
~ | 列出提示信息缓存;其中包含了之前tmux返回的各种提示信息 | |
窗口操作 | c | 创建新窗口 |
& | 关闭当前窗口 | |
数字键 | 切换至指定窗口 | |
p | 切换至上一窗口 | |
l | (小写L)在前后两个窗口间互相切换 | |
w | 通过窗口列表切换窗口 | |
, | (逗号)重命名当前窗口;这样便于识别 | |
. | (英文的句号,实心点)修改当前窗口编号;相当于窗口重新排序 | |
f | 在所有窗口中查找指定文本 | |
面板操作 | " | (英文状态的引号)将当前面板平分为上下两块 |
% | 将当前面板平分为左右两块 | |
x | 关闭当前面板 | |
! | 将当前面板置于新窗口;即新建一个窗口,其中仅包含当前面板 | |
Ctrl+方向键 | 以1个单元格为单位移动边缘以调整当前面板大小 | |
Alt+方向键 | 以5个单元格为单位移动边缘以调整当前面板大小 | |
Space | (空格)在预置的面板布局中循环切换;依次包括even-horizontal、even-vertical、main-horizontal、main-vertical、tiled | |
q | 显示面板编号 | |
o | (小写字母O)在当前窗口中选择下一面板 | |
方向键 | 移动光标以选择面板 | |
{ | 向前置换当前面板 | |
} | 向后置换当前面板 | |
Alt+o | 逆时针旋转当前窗口的面板 | |
Ctrl+o | 顺时针旋转当前窗口的面板 |