一、Tmux 是什么?
Tmux(Terminal Multiplexer)是一个终端复用工具,核心作用是在一个终端窗口里管理多个会话(Session)、窗口(Window)和窗格(Pane)。我个人理解,它本质上是给 SSH 会话套了一层“容器”——tmux 本身是守护进程,里面的子进程不依赖于本地终端是否存活,所以即使关闭终端或网络断开,任务也不会中断。
对经常需要 SSH 连服务器的人来说,tmux 解决了两个痛点:一是网络断了重连后可以恢复之前的工作状态,二是可以在同一窗口里同时跑多个任务(比如一边编辑代码一边看日志)。
二、安装
| 系统 | 命令 |
|---|---|
| Ubuntu/Debian | sudo apt install tmux |
| Arch Linux | sudo pacman -S tmux |
| macOS | brew install tmux |
| CentOS/RHEL | sudo yum install tmux |
安装后用 tmux -V 确认版本即可。
三、核心概念(三层层级)
Tmux 的组织结构可以理解为三层:
- 会话(Session):最顶层,一个会话就是一个独立的工作空间,可以在后台持续运行。给会话起名字非常重要,否则时间一长就忘了 0 号、1 号会话对应什么任务了。
- 窗口(Window):会话里面的“标签页”,每个窗口占据整个屏幕。
- 窗格(Pane):窗口可以分割成多个小区域,每个区域独立运行程序。
这个三层层级结构的好处是:每个会话可以对应一个项目(比如 blog、leetcode),会话里的不同窗口可以对应不同的功能模块,窗格则用来同时查看多个输出。
四、常用命令速记
1. 会话管理
| 操作 | 命令 | 快捷键 |
|---|---|---|
| 新建会话(命名) | tmux new -s 会话名 | — |
| 新建会话(不命名) | tmux | — |
| 分离会话(后台运行) | tmux detach | Ctrl+b d |
| 查看所有会话 | tmux ls | Ctrl+b s |
| 连接会话 | tmux attach -t 会话名 | — |
| 重命名当前会话 | tmux rename-session | Ctrl+b $ |
| 杀死会话 | tmux kill-session -t 会话名 | — |
| 杀死所有会话 | tmux kill-server | — |
新建会话时一定要用 -s 起名字,这样以后用 tmux attach -t 名字 就能直接恢复,不需要先查编号。
2. 窗口管理
| 操作 | 快捷键 |
|---|---|
| 创建新窗口 | Ctrl+b c |
| 切换到下一个窗口 | Ctrl+b n |
| 切换到上一个窗口 | Ctrl+b p |
| 切换到指定编号窗口(0-9) | Ctrl+b 数字 |
| 切换到上一个激活的窗口 | Ctrl+b l |
| 列出所有窗口 | Ctrl+b w |
| 重命名当前窗口 | Ctrl+b , |
| 关闭当前窗口 | Ctrl+b & 或 exit |
小技巧:用
Ctrl+b w可以列出所有窗口并交互式选择,比一个个翻页快多了。
3. 窗格(Pane)操作
| 操作 | 快捷键 |
|---|---|
| 垂直分割(左右分屏) | Ctrl+b % |
| 水平分割(上下分屏) | Ctrl+b " |
| 光标切换到其他窗格 | Ctrl+b 方向键 |
| 光标切换到下一个窗格 | Ctrl+b o |
| 显示窗格编号 | Ctrl+b q(编号消失前按数字跳转) |
| 当前窗格缩放至全屏/恢复 | Ctrl+b z |
| 关闭当前窗格 | Ctrl+b x |
| 当前窗格拆分为独立窗口 | Ctrl+b ! |
| 交换当前窗格与前一个 | Ctrl+b { |
| 交换当前窗格与后一个 | Ctrl+b } |
分割窗口是 tmux 最常用的功能之一。垂直分割用 %,水平分割用 ",这两个符号需要记一下。分割后建议立即用 Ctrl+b z 把某个窗格临时放大专心操作,弄完再按一次恢复布局。
调整窗格大小:
| 操作 | 快捷键 |
|---|---|
| 按 1 个单元格调整 | Ctrl+b Ctrl+方向键 |
| 按 5 个单元格调整 | Ctrl+b Alt+方向键 |
Ctrl+b q 显示编号后,按对应数字可以瞬间跳转到目标窗格,在窗格数量多的时候非常实用。
五、复制模式与滚动
默认情况下,tmux 里不能用鼠标滚轮滚动历史输出,需要用复制模式。
进入复制模式:Ctrl+b [
退出复制模式:q
进入复制模式后的常用操作:
| 操作 | 快捷键 |
|---|---|
| 向上滚动一行 | ↑ 或 k |
| 向下滚动一行 | ↓ 或 j |
| 向上翻页 | PageUp 或 Ctrl+b |
| 向下翻页 | PageDown 或 Ctrl+f |
| 开始选择文本 | 空格键 |
| 复制选中内容 | 回车键 |
| 粘贴 | Ctrl+b ] |
如果想要鼠标滚轮直接滚动,需要在 ~/.tmux.conf 配置文件中添加一行:set -g mouse on,然后重新加载配置即可。这样就能用鼠标滚轮滚动历史输出了,体验会好很多。
六、配置文件(~/.tmux.conf)
个人配置在 ~/.tmux.conf,改动后需要 tmux source-file ~/.tmux.conf 重新加载。
下面是我自己用的配置:
# 启用鼠标支持(滚动 + 选择窗格)
set -g mouse on
# 设置历史缓冲区大小
set -g history-limit 10000
# 设置状态栏样式
set -g status-bg black
set -g status-fg white
set -g status-left "#[fg=green]#S#[default]"
set -g status-right "#[fg=yellow] %Y-%m-%d %H:%M #[default]"
# 重新加载配置的快捷键
bind r source-file ~/.tmux.conf \; display "Reloaded!"
# 使用 vi 风格的复制模式键位(与 vim 保持一致)
setw -g mode-keys vi
# 快速分屏(方便记忆)
bind | split-window -h
bind - split-window -v
# 使用 hjkl 移动窗格(vim 用户福音)
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
配置说明:
Ctrl+a r用来重新加载配置,调试配置文件时很方便。- 用
|和-代替%和"做分屏,视觉上更直观(竖线=垂直分屏,横线=水平分屏)。 - 用
hjkl移动窗格,对习惯 vim 键位的人来说不用重新适应。
七、高频用法场景
场景 1:SSH 远程工作
连上服务器后的标准流程:
# 第一步,创建命名会话
tmux new -s myserver
# 正常干活...
# 临时要断开,分离会话
Ctrl+b d
# 下次重新连,恢复
tmux attach -t myserver
日常工作必须:连上服务器后第一件事就是创建 tmux 会话,而不是直接跑命令。断线重连后用
tmux ls查看会话,再用tmux attach -t xxx恢复,而不是重新开 shell。
场景 2:同时编辑和运行
在一个窗口里垂直分割成两个窗格:
Ctrl+b % # 左右分屏
左边用 vim 编辑代码,右边运行程序,修改后立即测试。
场景 3:监控多个服务
窗口 1:跑 web 服务
窗口 2:跑数据库
窗口 3:跑日志监控
窗口之间用 Ctrl+b n / Ctrl+b p 切换,每个窗口内部还可以继续分割。
场景 4:长时间任务(数据训练/模型跑批)
tmux new -s training
# 启动训练脚本
python train.py
Ctrl+b d # 分离会话,关闭终端
# 第二天回来
tmux attach -t training # 任务还在跑
这比 nohup 好多了,因为 nohup 只能让任务在后台继续跑,但无法重新连接到任务界面,而 tmux 可以随时恢复并查看实时输出。