tmux的学习与使用
Tmux Learning
1. Tmux 是什么?
1.1 Tmux介绍
Tmux (Terminal Multiplexer) 是OpenBSD项目开发的一款BSD协议授权的终端复用软件,允许用户通过单一终端连接创建并管理多个控制台会话、窗口及面板,支持SSH断开后进程持续运行,避免重复建立远程连接。
BSD(Berkeley Software Distribution) 伯克利软件套件,是Unix的衍生系统于1977至1995年间由加州大学伯克利分校开发和发布
OpenBSD是一个多平台的,基于4.4BSD的类UNIX操作系统,是BSD衍生出的三种免费操作系统(另外两种是NetBSD和FreeBSD)之一,被称为世界上最安全的操作系统
常见的命令行的典型使用方式是:打开一个终端窗口(terminal window,以下简称 “窗口”),在里面输入命令。 用户与计算机的这种临时的交互,称为一次 “会话”(session)
Session 的重要特点:窗口与其中启动的进程是连在一起的。打开窗口,会话开始;关闭窗口,会话结束,会话内部的进程也会跟着终止,不管进程有没有运行完。
常见的问题比如
- SSH登录服务器,不小心点掉了关闭窗口,直接结束进程
- 网络不稳定,突然断线,再次登录已经终止会话
为了解决这个问题,会话与窗口可以 “解绑”:窗口关闭时,会话并不终止,而是继续运行,等到以后需要的时候,再让会话 “绑定” 其他窗口。
1.2 Tmux的作用
本质上来说Tmux就是一个解绑工具,它允许你在单个终端窗口中创建多个虚拟终端对话,并能保持这些会话在后台运行
- 它允许同时运行多个会话和多个命令程序
- 它可以在新窗口接入已经存在的会话
- 它允许每个会话有多个连接窗口,多人实时共享会话
- 它支持窗口任意的垂直和水平拆分
2. 基本用法
其实Tmux并不复杂,虽然tmux有非常多的功能,但是主要掌握一些快捷键就行
2.1 Tmux安装
Tmux的安装非常简单,不同的系统对应不同的安装方式
# ubuntu
sudo apt-get install tmux
# CentOS 或 Fedora
sudo yum install tmux
# MacOS
brew install tmux
# bioconda
conda install -y tmux
2.2 Tmux启动
在安装完成后,终端直接输入,就会打开一个新窗口,这个就是tmux的虚拟终端
tmux
打开之后就是tmux虚拟终端,可以说是伪终端。在这个终端中运行任务,这个任务就一直待在虚拟终端中,即使突然掉线了,还可以回复任务,继续运行
最下面多了一条绿色状态栏,表示当前一个新终端里
2.3 前缀键
Tmux窗口有大量的隐藏快捷键(bind-key),所有快捷键都是通过前缀键唤起,默认的前缀键是 Ctrl+b
,一定要在英文键盘的模式下,先按下 Ctrl+b
,再按其它的键进行唤起。
例如先按下Ctrl + b
, 再按下 ?
,下面是显示出来的一部分结果,整个Tmux中快捷键非常的庞大,只需要记住常用的即可
因为Linux Shell下很多快捷键都被占用了,所以只能这样子操作了
bind-key -T prefix ? list-keys
bind-key -T prefix D choose-client -Z
bind-key -T prefix E select-layout -E
bind-key -T prefix L switch-client -l
bind-key -T prefix M select-pane -M
bind-key -T prefix [ copy-mode
bind-key -T prefix ] paste-buffer
bind-key -T prefix c new-window
bind-key -T prefix d detach-client
bind-key -T prefix f command-prompt "find-window -Z -- '%%'"
bind-key -T prefix i display-message
bind-key -T prefix l last-window
bind-key -T prefix m select-pane -m
bind-key -T prefix n next-window
bind-key -T prefix o select-pane -t :.+
bind-key -T prefix p previous-window
bind-key -T prefix q display-panes
bind-key -T prefix r refresh-client
bind-key -T prefix s choose-tree -Zs
bind-key -T prefix t clock-mode
bind-key -T prefix w choose-tree -Zw
bind-key -T prefix x confirm-before -p "kill-pane #P? (y/n)" kill-pane
bind-key -T prefix z resize-pane -Z
bind-key -T prefix \{ swap-pane -U
bind-key -T prefix \} swap-pane -D
bind-key -T prefix \~ show-messages
bind-key -r -T prefix DC refresh-client -c
bind-key -T prefix PPage copy-mode -u
bind-key -r -T prefix Up select-pane -U
bind-key -r -T prefix Down select-pane -D
3. 会话管理
3.1 新建会话
第一个启动的 Tmux 窗口,编号是 0,第二个窗口的编号是 1,以此类推。这些窗口对应的会话,就是 0 号会话、1 号会话 (编码就在最下栏绿色边框里面能够看到,新开会话都会被自动编号)
使用编号很难区分,还要找每个会话,不够直观,最好的方法就是给会话起名
tmux new -s <session-name>
3.2 分离会话
在 Tmux 窗口中,按下 快捷键 Ctrl+b
+ d
或者输入 tmux detach
命令,就会将当前会话与窗口分离
一定不能直接按exit
或Ctrl + d
离开会话,会直接断开所有会话
tmux detach # 退出当前Tmux窗口,但是会话和里面的进程仍然在后台运行
tmux ls
命令能够查看当前所有的Tmux会话
tmux list-session
3.3 接入会话
在上面使用tmux detach
分离之后,后台继续运算,需要接入会话的时候,使用命令就能恢复到之前的会话框
tmux attach -t <session name> # 使用会话名称
tmux attach -t 0 # 使用会话编号
3.4 杀死会话
同Shell
一样,使用kill
进行会话的结束,结束之后tmux ls
将无法展示出来创建的会话
tmux kill-session -t 0 #使用会话编号
tmux kill-session -t <session-name> # 使用会话名称
3.5 切换会话
切换会话,是切换不同的session,比如之前创建了tmux new -t
多个会话,在会话之间切换
tmux switch
tmux switch -t 0
tmux switch -t <session-name>
3.6 重命名会话
防止重命名会话冲突,可以用来修改会话的名字
tmux rename-session -t <old-name> <new-name>
4. 窗口管理
4.1 基本概念
- 会话(Session)
- tmux会话是一个独立的运行环境,可以包含多个窗口,即使断开连接,会话也会在后台继续运行
- 窗口(Window)
- 每个会话可以包含个多个窗口,类似与浏览器中的标签页
- 面板(Pane)
- 每个窗口可以分割称多个面板,允许同时查看和操作多个终端
Tmux中,会话,窗口和面板都是用来表示不同层级的概念
tmux 会话(session)
├── 窗口1(window)
│ ├── 面板(pane)
│ ├── 面板
│ └── 面板
├── 窗口2
└── 窗口3
窗口相当于 一个完整的终端屏幕。
- 每个窗口都可以独立运行不同的程序,比如一个运行 htop,另一个运行 vim。
- 默认一个 tmux 会话启动时就有一个窗口。
可以把窗口理解成浏览器中不同的标签页
每个窗口内部可以再划分成多个面板,相当于一个窗口中再切分出来多个小终端,各个面板可以显示不同内容,执行不同命令
4.2 常用命令和快捷键
会话管理
操作 | 快捷键 | 说明 |
---|---|---|
查看所有会话 | Ctrl+b s |
打开会话列表(可上下选择) |
从当前会话分离(退出但保持后台运行) | Ctrl+b d |
“detach” 当前会话 |
重新连接最近的会话 | (命令行)tmux attach 或 tmux a |
重新进入上次分离的会话 |
在多个会话间切换 | Ctrl+b ( / Ctrl+b ) |
切换到上一个 / 下一个会话 |
重命名当前会话 | Ctrl+b $ |
给当前会话取个名字 |
杀掉当前会话 | Ctrl+b : → 输入 kill-session |
在命令模式中结束当前会话 |
窗口管理
功能 | 快捷键 | 说明 |
---|---|---|
新建窗口 | Ctrl+b c |
创建一个新窗口(create) |
切换到下一个窗口 | Ctrl+b n |
next window |
切换到上一个窗口 | Ctrl+b p |
previous window |
按编号切换窗口 | Ctrl+b 0 ~ Ctrl+b 9 |
跳转到对应编号的窗口 |
列出所有窗口 | Ctrl+b w |
以菜单形式显示所有窗口(可选择) |
重命名当前窗口 | Ctrl+b , |
修改窗口名称(默认是命令名,比如 bash) |
关闭当前窗口 | Ctrl+b & 或 exit |
关闭整个窗口(所有面板一起关闭) |
切换到上一个活动窗口 | Ctrl+b l |
快速返回上一个使用的窗口 |
移动窗口位置 | Ctrl+b . |
移动窗口编号位置 |
查看窗口索引 | 状态栏中(下方默认显示 [0] bash [1] vim 等) |
面板管理
功能 | 快捷键 | 说明 |
---|---|---|
水平分割(上下分屏) | Ctrl+b " |
当前窗口上下分为两块 |
垂直分割(左右分屏) | Ctrl+b % |
当前窗口左右分为两块 |
在面板间切换 | Ctrl+b o |
依次循环切换到下一个面板 |
方向键切换 | Ctrl+b ↑/↓/←/→ |
按方向切换到相邻面板(更直观) |
交换面板位置 | Ctrl+b { / Ctrl+b } |
当前面板与上一个/下一个面板交换位置 |
调整面板大小 | Ctrl+b + 方向键 |
每次缩放一个单位 |
(更快调整) | Ctrl+b Alt+方向键 |
快速调整面板大小(需终端支持) |
显示面板编号 | Ctrl+b q |
显示编号(几秒后消失),再按编号跳转 |
关闭当前面板 | Ctrl+b x 或 exit |
关闭该面板 |
最大化当前面板 | Ctrl+b z |
放大/还原当前面板(zoom in/out) |
同步输入到所有面板 | Ctrl+b : → 输入 setw synchronize-panes on |
所有面板同时输入(例如批量执行命令) |
取消同步 | Ctrl+b : → 输入 setw synchronize-panes off |
恢复单独输入 |
将面板变成新窗口 | Ctrl+b ! |
把当前面板独立成一个新窗口 |