? tmux,“Terminal MultipleXer”,意思是"终端复用器"。是一个可以让人们通过一个窗口操作多个会话的工具,对于经常操作Linux系统的运维人员来说,绝对是一款提高工作效率的利器。
? 凡是互联网行业的从业者,无论是做运维的同学,还是做开发的同学,一般都是在自己的工作电脑上安装远程连接工具(如 iTerm、putty、XShell、SecureCRT 等),远程登录到公司服务器上,进行具体的操作,而其中一些操作的耗时会很长。
? 在这期间,一旦我们的远程连接工具所在的工作电脑出现断网或断电的情况,那么很多耗时较长的操作就会因此中断,这是所有运维、开发同学都很头疼的一个问题。下面,我们就先给大家列出一些典型的痛点。
痛点一:大数据传输的漫长一夜
相信做过 Linux 服务运维的同学,都用 scp 进行过服务器间的大文件网络传输。一般这需要很长的时间,这期间,如果工作电脑出现断网或者断电的情况,则会导致远程连接工具无法与服务器通信,从而使得它所控制的数据传输也因此中断。
情景再现:
localhost:~ roc$ ls -hl
total 36419584
-rw------- 1 roc staff 17G 1 20 11:06 win7.vdi
localhost:~ roc$ scp -P 22000 win7.vdi roc@roclinux.cn:/home/roc
win7.vdi 0% 7296KB 800.3KB/s 6:19:05
? 一个 17GB 的大文件,刚刚开始传输,预估耗时 6 小时 19 分钟,谁能保证中间不出现关机和断电的情况呢。
? 有些同学说可以用 nohup 来解决啊,是的,这是一个办法,可是使用 nohup 的问题在于如果同时传输的任务众多,则最后你自己可能都分不清哪个任务对应哪个传输了,何况 nohup 还会留下 nohup.out 这么一个临时文件在那里。
扩展:nohup命令
nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。
nohup 命令,在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。
? 还有同学说,即使中断了,也可以断点续传啊。可惜的是,scp 并不支持断点续传。如果改用 rsync 倒是可以,可惜 rsync 参数用起来很是复杂,谁能保证每位运维工程师都能熟练掌握那么多复杂的参数呢?这个时候,请试一试 tmux 吧!
扩展:rsync命令
痛点二:正在编译却被拉去开会
? 和大文件数据传输情况类似,一些大型的开发项目的代码编译过程,往往也需要很长的时间,短则几分钟,长则一通宵。对于一通宵的编译来说,这要是中间出现断网断电,那就相当悲剧了。整个项目进展就又要向后推迟至少一天。这个时候,我们向你推荐 tmux!
痛点三:多个窗口切换到晕
? 作为运维工程师,一定有过在众多窗口间切换,查看各种服务器上的信息和状态的情况,这个时候,如果没有一款好用的窗口管理软件,过不了多久,你就会晕头转向了。就像图 2 所示的这种情况。
这个时候,tmux 可以帮到你!
痛点四:一屏显示多窗口之殇
有时候为了进行多文件内容对比,如果没有一款很好用的分屏管理工具,那么我们只好创建多个终端,然后手动调整它们的大小和位置,如图 3 所示。
其实并不需要这么麻烦,tmux 可以帮助我们轻松分屏!
#centos,redhat,fedora
[root@localhost ~]# yum -y install tmux
#tmux 依赖于 libevent 库和 ncurses 库,所以如果你的系统中原本没有这两个库的话,yum 会在安装时自动一并安装上。
# ubuntu
[root@localhost ~]# apt-get install tmux
# OS X Server
[root@localhost ~]# brew install tmux
[root@localhost ~]# tmux new -s roclinux
-s
是session的缩写。顾名思义,我们启动了一个全新的tmux会话(tmux session),并且把这个会话起名叫做roclinux。
tmux环境和之前的环境没什么不同,因此所有的操作与原来一样
# 在创建会话的同时,tmux会在会话中创建一个窗口(tmux window)
最底部出现了一个1:root@localhost ,说明我们在tmux session 中又创建了一个窗口
细心的同学可能会提出一个问题,为什么刚才星号(*)是在 0:root@localhost 后面,而现在却到了 1:bash 后面呢?
这是个好问题,星号(*)在这里表示的是 “当前处于活跃状态的窗口” ,也就是哪个窗口现在处于可操作状态,星号(*)就在哪个窗口的后面。这回知道了吧。
既然,我们在 roclinux 这个 session 中已经有了两个窗口,那么如果想在两个窗口间进行切换,应该怎么操作呢?
很简单,假如我们要切换到 0:root@localhost 这个窗口,步骤如下:
看,我们刚才说的星号(*)是不是已经悄悄移动到 0:bash 的后面啦。同理,在按下 Ctrl+B 组合键后,按相应数字键,就可以切换到相应的窗口了。就是这么简单!
在0:root@localhost 这里执行一个循环命令
[root@localhost ~]# watch -n 2 free
# 该命令会每隔2秒钟更新一次内存信息
这个命令会每隔 2 秒钟更新一次内存使用状态,如果不输入 Ctrl+C,则永远不会退出。
假如这时候你要带着办公电脑去开会,你的电脑要断网,又不想中断服务器上正在执行的 watch 命令,怎么办呢?
哈哈,tmux 正好可以派上用场,方法是这样的:
这表示,我们已经切断了办公电脑和刚才那个 tmux 之间的桥梁。现在如果你要外出,可以放心地关闭你的电脑了。
当你回到家后,打开电脑,连接到你的那台远程服务器,然后执行一个神奇的命令:
[root@roclinux ~]# tmux ls
roclinux: 2 windows (created Fri Jan 22 16:30:13 2016) [130x36]
[root@roclinux ~]# tmux attach -t roclinux
看,我们又回到了刚才的状态,那个查看内存使用状态的 watch 命令,在那里乖乖地运行着。这就是 tmux 的神奇之处,它可以让远端服务器的命令,脱离用户自己的电脑来执行,还可以随时召唤回来,继续进行操作和查看。
# 查看有所有tmux会话
指 令:tmux ls
快捷键:Ctrl+s s
# 列出所有窗口
快捷键:Ctrl+s w
# 新建tmux窗口
指 令:tmux new -s <session-name>
# 重命名会话
指 令:tmux rename-session -t <old-name> <new-name>
快捷键:Ctrl+s $
# 分离会话
指 令:tmux detach 或者使用 exit(关闭窗口)
快捷键:Ctrl+s d
# 重新连接会话
指 令:tmux attach -t <session-name> 或者使用 tmux at -t <session-name>
#平铺当前窗格(个人很喜欢的快捷键,注意:平铺的是当前选中的窗格)
快捷键:Ctrl+s z (再次 Ctrl+b z 则恢复)
# 杀死会话
指 令:tmux kill-session -t <session-name>
# 切换会话
指 令:tmux switch -t <session-name>
# 划分上下两个窗格
指 令:tmux split
快捷键:Ctrl+s “
# 划分左右两个窗格
指 令:tmux split -h
快捷键:Ctrl+s %
# 光标切换到上方窗格
指 令:tmux select-pane -U
快捷键:Ctrl+s 方向键上
# 光标切换到下方窗格
指 令:tmux select-pane -D
快捷键:Ctrl+s 方向键下
# 光标切换到左边窗格
指 令:tmux select-pane -L
快捷键:Ctrl+s 方向键左
# 光标切换到右边窗格
指 令:tmux select-pane -R
快捷键:Ctrl+s 方向键右
Ctrl+b激活控制台;此时以下按键生效!!!
举个例子:
帮助命令的快捷键是Ctrl+s ?
它的用法是:在 Tmux 窗口中,先按下Ctrl+b,再按下?,就会显示帮助信息。
系统操作
? 列出所有快捷键;按q返回
d 脱离当前会话;这样可以暂时返回Shell界面,输入tmux attach能够重新进入之前的会话
D 选择要脱离的会话;在同时开启了多个会话时使用
Ctrl+z 挂起当前会话
r 强制重绘未脱离的会话
s 选择并切换会话;在同时开启了多个会话时使用
: 进入命令行模式;此时可以输入支持的命令,例如kill-server可以关闭服务器
[ 进入复制模式;此时的操作与vi/emacs相同,按q/Esc退出
~ 列出提示信息缓存;其中包含了之前tmux返回的各种提示信息
窗口操作
c 创建新窗口
& 关闭当前窗口
数字键 切换至指定窗口
p 切换至上一窗口
n 切换至下一窗口
l 在前后两个窗口间互相切换
w 通过窗口列表切换窗口
, 重命名当前窗口;这样便于识别
. 修改当前窗口编号;相当于窗口重新排序
f 在所有窗口中查找指定文本
面板操作
” 将当前面板平分为上下两块
% 将当前面板平分为左右两块
x 关闭当前面板
! 将当前面板置于新窗口;即新建一个窗口,其中仅包含当前面板
Ctrl+方向键 以1个单元格为单位移动边缘以调整当前面板大小
Alt+方向键 以5个单元格为单位移动边缘以调整当前面板大小
Space 在预置的面板布局中循环切换;依次包括even-horizontal、even-vertical、main-horizontal、main-vertical、tiled
q 显示面板编号
o 在当前窗口中选择下一面板
方向键 移动光标以选择面板
{ 向前置换当前面板
} 向后置换当前面板
Alt+o 逆时针旋转当前窗口的面板
Ctrl+o 顺时针旋转当前窗口的面板
1. tmux/screen rz/sz 文件卡死快速退出方法。(tmux 暂不能使用rz/sz)
2. 评论区大佬给出的小技巧:(可以实现鼠标选中窗格和移动)
# 在tmux.conf里加一句:
set -g mouse on