终端复用器 tmux:会话、窗口与断线恢复
橙风小兔
5 分钟阅读
tmux 解决的是一个具体痛点:SSH 连着服务器跑一个长时间任务,网络一抖连接断了,任务也跟着没了。tmux 在服务器上常驻一个会话,断线只是客户端离开,会话里的进程继续跑,重连就能接回原状。它和单纯后台跑进程的区别,在于你拿回的是一整块可交互的屏幕,而不是一个脱离了终端的作业。
核心概念:服务器、会话、窗口、面板
tmux 启动后有一个 server 进程。一个 server 下可有多个 session(会话),一个 session 下有多个 window(窗口),一个 window 可垂直或水平切成多个 pane(面板)。日常用得最多的是 session 和 pane:一个 session 装一套相关工作,pane 用来同屏看日志和编辑。理解这四层嵌套关系,是后面所有快捷键不混乱的前提——很多新手以为窗口和面板是一回事,结果在错误层级上切来切去。
最小可用命令
tmux new -s dev # 新建名为 dev 的会话
tmux attach -t dev # 重新接入 dev 会话
tmux ls # 列出所有会话
tmux kill-session -t dev # 关闭会话
进入会话后,所有快捷键都以前缀键 Ctrl+b 开头,松开再按功能键。常用:% 竖切面板、" 横切面板、方向键在面板间移动、d 脱离会话(detach,进程继续)、c 新建窗口、n/p 切换窗口。前缀键的设计是因为 tmux 不能吞掉所有按键,必须有一个"进入命令模式"的扳机,这是它和图形化多终端在交互上的根本差异。
断线恢复的真实流程
本地网络断了,SSH 客户端退出,但服务器上的 tmux server 没收到终止信号,session 里的 npm run dev、python train.py 之类进程照常运行。重新连上服务器后执行 tmux attach -t dev,之前打开的编辑器、滚动的日志、正在跑的命令全部还在。这是它比单纯 nohup ... & 强的地方:你拿回的是一个完整可交互的界面,而不是一个脱离了终端的作业。对跑训练任务、长编译、等待中的交互式 shell 来说,这种"人走任务不留"的特性几乎是刚需。
几个容易踩的点
前缀键冲突:如果你把 CapsLock 映射成 Ctrl,注意 Ctrl+b 离主键区略远,可在 ~/.tmux.conf 改成 Ctrl+a:
set -g prefix C-a
unbind C-b
bind C-a send-prefix
面板内滚动:tmux 默认进入"复制模式"才能翻页,Ctrl+b 后按 [,用方向键或 PgUp/PgDn 滚动,按 q 退出。直接滚轮在多数配置下不会滚面板历史,这是新手最常见的困惑,以为 tmux 丢了上面的输出,其实只是没进复制模式。
宽字符与中文:某些旧终端下 tmux 对中文宽度判断出错,导致光标错位,可在配置里加 set -g utf8 on(新版本 tmux 已默认 UTF-8)。面板尺寸:attach 时 tmux 会按当前终端大小重排面板,若你从大屏切到小屏,布局会被压,可用 resize 相关命令或固定布局缓解。
复制粘贴的坑
tmux 有自己的剪贴板缓冲,默认不和系统剪贴板互通。面板里用鼠标选中复制的内容,离开 tmux 后粘贴板是空的。要让它和系统剪贴板打通,需要配置 set -g mouse on 配合 capture-pane 或绑定到系统剪贴板程序。这个不一致是很多人"在 tmux 里复制的东西粘不出来"的根因,提前配好能省掉反复来回拷的麻烦。
何时不一定需要它
本地桌面环境、任务都是秒级完成的命令、或者已经用带会话保持功能的 IDE 远程开发插件时,tmux 的额外心智成本不一定值得。但凡是"连服务器跑长任务 + 网络不稳定"的组合,它基本是无可替代的轻量方案,装一个常驻,值回票价。
浏览 0
点赞 0
评论 0