tmux 是一个终端复用器,它让你在一个终端窗口里管理多个独立的会话、窗口和窗格,并且这些会话在 SSH 断连或主动分离后依然在后台运行,随时可以重新连接回来。
一、tmux 是什么?
tmux(Terminal Multiplexer)是一个终端复用器。它允许在一个终端屏幕上创建、访问和控制多个终端。最核心的能力是:tmux 可以从当前屏幕分离(detach),在后台继续运行,之后随时重新附加(reattach)。
为什么需要它?
如果你用 SSH 连远程服务器跑一个长时间的深度学习训练,网络一断,SSH 会话结束,进程很可能被终止,几个小时的训练白费。tmux 解决的正是这个问题:会话与终端窗口解耦。你关掉终端、断网、甚至关机,tmux 里的进程照常跑。回来后tmux attach,一切照旧。
二、核心概念:会话、窗口、窗格
tmux 的层次结构是Session → Window → Pane,三者是包含关系。
Session(会话)
会话是 tmux 的顶层工作区,是一个“伪终端集合”。每个会话有名字,可以独立分离和重连。你可以同时有多个会话,比如一个跑训练、一个跑数据处理、一个日常运维。会话是持久的,会存活于意外断连(如 SSH 超时)或主动分离(C-b d)之后。
Window(窗口)
一个会话包含一个或多个窗口。窗口占据整个屏幕,相当于“标签页”。每个窗口有自己的编号和名称,状态栏底部显示当前窗口信息。
Pane(窗格)
一个窗口可以被分割成多个矩形窗格,每个窗格是独立的伪终端。这意味着你可以在同一个窗口里,左边跑htop,右边跑日志tail -f,下面再开一个 shell 写代码,全部同时可见。
这种“会话-窗口-窗格”三层模型是 tmux 区别于 screen 的关键:screen 只有“窗口”一层概念,而 tmux 将窗口和窗格拆成了两个对象,管理更灵活。
三、工作原理:客户端-服务器模型
tmux 采用客户端-服务器(client-server)架构。
当你运行tmux时,实际上启动了一个tmux 服务器进程,服务器管理所有会话、窗口和窗格。你看到的终端界面是一个客户端进程,通过/tmp下的 Unix 域套接字与服务器通信。
这种设计的直接好处是:多个客户端可以连接到同一个会话。比如你和同事通过 SSH 连到同一台服务器,可以附加到同一个 tmux 会话,实时看到相同的终端输出,协作调试。窗口可以在不同会话之间自由移动,客户端也可以轻松切换会话。
一个需要注意的副作用:如果 tmux服务器进程崩溃,所有会话都会丢失。但实践中 tmux 非常稳定。
四、安装与启动
# Ubuntu / Debian sudo apt install tmux # CentOS / Fedora sudo yum install tmux # macOS brew install tmux启动 tmux:
tmux # 创建匿名会话 tmux new -s work # 创建名为 work 的会话启动后,终端底部会出现状态栏,显示当前会话和窗口信息。
五、常用命令与快捷键
tmux 的快捷键需要一个前缀键(prefix),默认是Ctrl+b。按完前缀键再按功能键。
会话管理
| 操作 | 命令 / 快捷键 |
|---|---|
| 新建命名会话 | tmux new -s mysession |
| 列出会话 | tmux ls |
| 附加到会话 | tmux attach -t mysession |
| 分离会话 | Ctrl+b然后d |
| 杀掉会话 | tmux kill-session -t mysession |
窗口与窗格操作
| 操作 | 快捷键 |
|---|---|
| 新建窗口 | Ctrl+b然后c |
| 垂直分屏(左右) | Ctrl+b然后% |
| 水平分屏(上下) | Ctrl+b然后" |
| 切换窗格 | Ctrl+b然后方向键 |
| 关闭窗格 | 输入exit或Ctrl+d |
翻页查看历史输出
tmux 默认不支持鼠标滚轮。按Ctrl+b然后[进入翻页模式,用方向键或 PageUp/PageDown 查看历史日志,按q退出。
六、配置与插件
基础配置(~/.tmux.conf)
tmux 的默认配置极简,真正的力量来自自定义。几个最实用的配置:
# 开启鼠标支持(点击切换窗格、拖拽调整大小、滚轮翻页) set -g mouse on # 把前缀键从 Ctrl+b 改为 Ctrl+a(更顺手) unbind C-b set -g prefix C-a bind C-a send-prefix # 窗口编号从 1 开始 set -g base-index 1 setw -g pane-base-index 1 # 用 | 和 - 分屏(比 % 和 " 更直观) bind | split-window -h -c "#{pane_current_path}" bind - split-window -v -c "#{pane_current_path}"改完后重载配置:tmux source-file ~/.tmux.conf。
插件管理(TPM)
Tmux Plugin Manager(TPM)是管理 tmux 插件最方便的方式。
安装步骤:
# 1. 克隆 TPM git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm # 2. 在 ~/.tmux.conf 底部添加 set -g @plugin 'tmux-plugins/tpm' set -g @plugin 'tmux-plugins/tmux-sensible' run '~/.tmux/plugins/tpm/tpm' # 3. 重载配置后,按 Ctrl+b I 安装插件常用插件包括tmux-resurrect(保存和恢复会话)、tmux-continuum(自动保存)、vim-tmux-navigator(Vim 和 tmux 之间无缝切换窗格)。
七、脚本化与自动化
tmux 几乎所有的命令都可以在 shell 脚本中非交互执行。这意味着你可以自动化终端工作流。
常见模式:
# 检查会话是否存在,避免重复创建 tmux has-session -t mywork 2>/dev/null || tmux new -s mywork -d # 在指定会话中发送命令 tmux send-keys -t mywork 'python train.py' Enter # 捕获窗格输出 tmux capture-pane -t mywork -p # 分离模式创建窗口和窗格 tmux new -s work -d tmux split-window -h -t work这种能力让 tmux 成为自动化交互式 CLI 工具的理想载体。像git rebase -i、vim这类需要实时输入输出的交互程序,可以通过 tmux 的send-keys和capture-pane实现程序化控制。
八、常见问题排查
| 问题 | 原因与解决 |
|---|---|
| 颜色显示不正确 | 检查$TERM是否为screen-256color或tmux-256color;在配置中设置set -g default-terminal "tmux-256color" |
| CPU 占用高 | 自动重命名窗口可能消耗 CPU,关掉:setw -g automatic-rename off |
| Vim 中 Esc 键响应慢 | 在配置中加入set -g escape-time 0 |
| Putty 中 Ctrl+方向键无效 | 终端发送的按键序列与 tmux 预期不符,需要调整 Putty 的终端设置或 tmux 的 key binding |
| macOS 权限错误 | /tmp下 socket 目录权限问题,检查/private/tmp/tmux-<uid>的权限 |
九、口述总结
“tmux 是终端复用器,核心价值是把终端会话和终端窗口解耦。它的三层模型是 Session、Window、Pane:会话是顶层工作区,窗口是标签页,窗格是分割区域。底层是客户端-服务器架构,服务器管理所有会话,客户端通过 Unix socket 连接,所以多个客户端可以共享同一个会话。最常用的场景是 SSH 到远程服务器后跑长时间任务,即使断网或关掉终端,tmux attach就能恢复。快捷键默认前缀是 Ctrl+b,分离是 Ctrl+b d,分屏是 Ctrl+b % 和 Ctrl+b "。配置写 ~/.tmux.conf,插件用 TPM 管理。tmux 还支持完全脚本化,可以用send-keys和capture-pane自动化交互式 CLI 工具。面试里如果被追问,我会强调:tmux 的核心价值不是‘多开终端’,而是‘会话持久化’——它让进程的生命周期独立于网络连接和终端窗口,这是远程开发和长任务运行的刚需。”