什么是tmux?
Tmux是一个终端复用工具,用于在一个终端窗口中运行多个终端会话的能力。可以简单的理解为他允许你在一个终端下模拟出多个终端来进行操作,而不是不停的打开终端标签。尤其是对于远程服务器而言:
- 运行一个脚本的时候,如果服务器断掉当前进程被杀死,脚本就无法运行了
- 运行一个脚本或编辑一个文件的时候,想要切换目录等操作就必须重新打开一个SSH连接
如果遇到上面两个问题都都可以求助于tmux来解决。
Tmux安装
对于linux来说,使用对应的包管理器安装即可:
yum install tmux
Tmux基本概念
tmux采用C/S模型构建,输入tmux相当于开启了一个服务器,此时默认将新建一个会话,然后会话中默认新建一个窗口中默认新建一个面板。这就是Tmux中最重要的三个概念:
- 会话(session):会话就相当于一个SSH连接,默认情况下SSH连接与启动的会话是连在一起的,打开连接就开启了一段会话,而关闭连接不管这个会话中进程是否运行完也随之结束。而tmux实际上就是将会话与连接解绑,连接断开后会话并不终止而是继续运行,等到需要的时候还可以绑定到其他连接上,而对于本机而言SSH连接也等同于打开一个终端窗口。
- 窗口(window):一个会话可以包含多个窗口,其实就是一个会话可以绑定到多个窗口上。窗口默认会充满会话界面,因此这些窗口中可以运行相关性不大的任务。
- 面板(pane):一个窗口可以被分割为多个面板,一个窗口下的面板都处于同一个界面下,这些面板适合运行相关性高的任务,以便同时观察他们的运行情况。
而我们使用Tmux实际上就是对这三个概念的新建、关闭、修改。
会话(session)
- 新建会话
tmux # 新建一个无名称的会话,不推荐
tmux new -s demo #新建一个名称为demo的会话,可以使用alias来创建别名
如果处于tmux中,终端下会出现一个状态栏:
其中如果使用tmux创建无名会话的话,默认名称会从0到1这样的顺序排列。
注意,在tmux会话中如果执行这个命令弹出以下错误:
sessions should be nested with care, unset $TMUX to force
意思就是会话嵌套必须小心,也可以复位$TMUX来强制进行会话嵌套。当然建议还是不要进行会话嵌套,如果实在要在会话中新建一个会话的话可以使用:
ctrl+b :new
2.重命名会话
如果你使用tmux直接创建一个默认的会话时,其名称是0,1,2这样的名称并不好记忆,此时就可以使用rename命令来重命名会话:
tmux rename-session -t old-name new-name
- 断开当前会话
其实就是讲当前的窗口与该会话解绑,然当前窗口执行其他工作,而将会话置于后台,此时会话并不会被关闭,而是在后台继续运行。
tmux detach #断开当前会话
也可以使用ctrl+b d这个快捷键来断开当前会话。
- 进入之前的会话
断开会话后,如果想要接着上次留下的现场继续工作,就需要接入会话了,使用attach命令来接入:
tmux attach-session -t demo #接入demo会话
tmux a -t demo #可以使用简写形式 a 就相当于 attach-session
tmux a #默认进入第一个会话
- 杀死会话
当一个会话的使命完成后,就可以使用kill命令来杀死他们,kill命令有kill-pane kill-server kill-session和kill-window四个,其中kill-session就是用来杀死会话的。
tmux kill-session -t demo #杀死demo会话
tmux kill-server #关闭服务器,就相当于杀死了所有的会话
- 查看所有会话
在你拥有多个会话的时候,不知道如何切换是就需要查看所有的会话了:
tmux list-session #查看所有会话
tmux ls #简写形式
也可以通过ctrl+b s来进入一个交互式会话列表,这里罗列了tmux管理的所有会话以及会话的窗口,你可以使用方向键在选中一个按下回车进入相应的会话窗口。
- 切换会话
如果我们想要从一个会话中切换到另一个会话中,有三种方法,最笨的就是首先detach断开当前会话,然后attach到你想切换的会话中。最简单的就是使用ctrl+b s进入交互式会话列表,然后选择一个会话。还有一个tmux给出的switch命令也可以实现在会话中直接切换到其他会话:
tmux switch -t session-name
总结
命令 | 快捷键 | 描述 |
---|---|---|
tmux new -s session-name | ctrl+b :new | 创建新会话 |
tmux rename-session -t oldname newname | ctrl+b $ | 重命名会话 |
tmux detach | ctrl+b d | 断开当前会话 |
tmux attach-session -t session-name | 无 | 接入一个会话 |
tmux kill-session -t session-name | 无 | 杀死一个会话 |
tmux list-session | ctrl+b s | 列出当前会话 |
tmux switch -t session-name | 无 | 切换会话 |
窗口(window)
一个会话默认开启一个窗口,但是tmux允许你新建多个窗口。这可能就是进程和协程的关系,如果对于不同的任务开启不同的会话其开销肯定要比在一个会话中开启多个窗口要低。所以说一般情况下我们应该都只需要开启一个常住的会话,在其中开启多个窗口来管理多个任务。如果需要临时测试一个项目的时候在开启一个会话用完销毁就好了。
- 新建窗口
tmux new-window -n test #新建一个名称为test的窗口
也可以通过chrl+b c来新建窗口
可以在状态栏下左下角查看窗口的状态:
- 关闭窗口
tmux kill-window #关闭当前窗口
tmux kill-window -t window-name/window-num #关闭某个窗口,可以是名称也可以说编号
也可以通过chtl+b &来关闭窗口
- 切换窗口
tmux select-window -t window-name/window-num #切换到某一个窗口
切换窗口有很多快捷键 ctrl+b 0~9切换到指定窗口,ctrl+b p切换到上一个窗口,ctrl+b n切换到下一个窗口。ctrl+b w打开一个选择列表来选择其中一个窗口切换。
- 重命名窗口
tmux rename-window new-name #为当前窗口重命名
快捷键为ctrl+b ,来重命名当前窗口。
总结
命令 | 快捷键 | 描述 |
---|---|---|
tmux new-window -n window-name | ctrl+b c | 新建窗口 |
tmux kill-window -t window-name/window-num | ctrl+b & | 关闭窗口 |
tmux select-window -t window-name/window-num | ctrl+b 0~9/p/n/w | 切换窗口 |
tmux rename-window new-name | ctrl+b , | 重命名窗口 |
面板操作
Tmux可以将窗口分成多个面板,每个面板下可以运行不同的命令。
- 划分面板
tmux split-window #上下划分两个面板 ctrl+b %
tmux split-window -h #左右划分两个面板 ctrl+b "
- 移动光标
tmux select-pane -U #切换到上方面板 ctrl+b 方向键来实现
tmux select-pane -D #切换到下方面板
tmux select-pane -L #切换到左方面板
tmux select-pane -R #切换到右方面板
- 交换窗格位置
tmux swap-pane -U #当前面板上移 ctrl+b {
tmux swap-pane -D #当前面板下移 ctrl+b }
- 关闭窗格
tmux kill-pane #关闭当前窗格 ctrl+b x
总结
命令 | 快捷键 | 描述 |
---|---|---|
tmux split-window | ctrl+b " | 上下划分面板 |
tmux split-window -h | ctrl+b % | 左右划分面板 |
tmux kill-pane | ctrl+b x | 关闭当前面板 |
tmux resize-pane -Z | ctrl+b z | 最大化面板,再次重复命令恢复正常 |
tmux display-panes | ctrl+b q | 显示当前面板编号,在编号消失前输入对应的数字可切换到对应面板 |
tmux swap-pane -U | ctrl+b { | 向前置换当前面板 |
tmux swap-pane -D | ctrl+b } | 向后置换当前面板 |
tmux select-pane -UDLR | ctrl+b 方向键 | 移动光标切换面板 |
tmuxse select-pane -t :.+ | ctrl+b o | 选择下一个面板 |
tmux resize-pane -UDLR 5 | ctrl+b alt+方向键 | 调整面板大小 |
tmux clock-mode | ctrl+b t | 显示时钟 |
其他命令
tmux list-keys #列出所有快捷键
tmux list-commands #列出所有命令
参考:
tmux使用手册