tmux:SSH 断了任务不丢——终端里的分屏神器
你在手机上 SSH 连 VPS,下个软件包下到一半,地铁进隧道信号一断——好,任务没了,重新来。
tmux 就是来治这个的:它让你的终端会话"断线不死",还能一个窗口里分屏、多开标签页。装一次,用一辈子。
先装上
sudo apt update && sudo apt install -y tmux
装完敲 tmux 就能进。退出?别直接关窗口——exit 或者 Ctrl+d 会杀掉会话,先别急,看完 detach 那节再说。
核心概念:会话、窗口、窗格
tmux 里有三层:
会话(session):一个独立的工作区,可以 detach 扔后台、随时 attach 回来
窗口(window):会话里的"标签页",底部状态栏能看到一排
窗格(pane):窗口里的"分屏",一个窗口可以切成好几块
session "vps" ← 一个会话
├── window 0: zsh ← 标签页1
│ ├── pane 0 ← 分屏左
│ └── pane 1 ← 分屏右
└── window 1: htop ← 标签页2
所有操作都通过前缀键 Ctrl+b 触发:先按 Ctrl+b 松开,再按另一个键。比如"左右分屏"就是 Ctrl+b 然后按 %。
保命技能:detach 和 attach
这才是 tmux 的灵魂。开一个带名字的会话:
tmux new -s download
wget https://releases.ubuntu.com/24.04/ubuntu-24.04-desktop-amd64.iso
--2026-10-11 09:41:02-- https://releases.ubuntu.com/24.04/...
正在连接 releases.ubuntu.com... 已连接。
HTTP 请求已发出,正在等待回应... 200 OK
长度:5905580032 (5.5G) [application/x-iso9660-image]
3% [====> ] 183,234,560 11.2MB/s 剩余 7m 51s
现在按 Ctrl+b 再按 d(detach,分离)。wget 还在后台跑,你已经回到普通终端了。手机信号断了?没关系——tmux 会话活在服务器上,跟你的 SSH 连接没关系。
重新 SSH 上来:
tmux attach -t download
下载进度还在那儿,一秒没停。看当前有哪些会话:
tmux ls
download: 1 windows (created Sun Oct 11 09:41:20 2026)
blog: 2 windows (created Sat Oct 10 22:15:03 2026) (attached)
(attached) 表示正连着看。任务跑完了想彻底结束:在会话里敲 exit,或者外面杀掉:
tmux kill-session -t download
记住这句口诀:长任务先 tmux new -s 名字,断线了 tmux attach -t 名字,没有 tmux 就没有安全感。
窗口:标签页式管理
进会话后试试这几个:
改名很实用,比如一个窗口叫 日志,一个叫 部署,底部状态栏长这样:
[0:zsh] 1:日志* 2:部署- "vps" 09:41 11-Oct-26
星号是当前窗口,- 是上一个。名字一目了然,不用靠记忆猜哪个标签在干嘛。
窗格:一个屏幕当四个用
分屏是 tmux 最高频的用法:
经典组合:左边跑 htop 看资源,右边敲命令,上面再开个小窗格 tail -f 跟日志:
htop # 左窗格:实时资源
tail -f /var/log/syslog # 右上窗格:盯日志
┌─────────────┬─────────────┐
│ │ tail -f 日志 │
│ htop ├─────────────┤
│ │ shell │
└─────────────┴─────────────┘
不用开三个 SSH 连接,一个窗口全搞定。
复制模式:鼠标失灵时的救命绳
手机上 SSH 经常选不中文字?tmux 自带复制模式。按 Ctrl+b [ 进入,屏幕冻结、光标可动:
方向键移动光标
空格开始选择,回车复制Ctrl+b ]粘贴
选中的文本存在 tmux 的剪贴板里,跨窗格、跨窗口都能粘。配合手机端 Conduit 粘贴容易丢换行的问题,先在 tmux 里选中复制,再 Ctrl+b ] 粘贴,比手指在屏幕上划选准得多。
配置:三行解决 80% 的别扭
默认配置有两个槽点:前缀键 Ctrl+b 按着别扭,分屏后鼠标滚轮不能翻历史。写个配置文件一次搞定:
nano ~/.tmux.conf
# 鼠标支持:滚轮翻历史、点击切换窗格、分屏拖边框
set -g mouse on
# 状态栏好看一点:显示会话名、日期时间
set -g status-right '#[fg=green]#S #[fg=white]%Y-%m-%d %H:%M'
# 窗口编号从 1 开始(键盘 1 比 0 顺手),关窗口后自动重排
set -g base-index 1
set -g renumber-windows on
# 分屏改成 | 和 -,跟直觉一致
bind | split-window -h
bind - split-window -v
unbind '"'
unbind %
保存后,在 tmux 里按 Ctrl+b : 输入 source-file ~/.tmux.conf 回车生效。以后每次进 tmux 自动加载。
# 生效后底部状态栏
[1:zsh] 2:日志* 3:部署- vps 2026-10-11 09:41
实战:给博客部署开个"不死会话"
把几节串起来,走一遍真实流程:
# 1. 开个叫 blog 的会话
tmux new -s blog
# 2. Ctrl+b c 新建窗口,Ctrl+b , 改名叫 deploy
# 3. Ctrl+b | 左右分屏:左边跑部署,右边 tail 日志
docker compose -f /opt/halo/docker-compose.yml up -d
docker logs -f halo
这时候手机锁屏、信号断、App 被系统杀掉——随便。晚上回家:
tmux ls # 看看 blog 会话还在
tmux attach -t blog # 回来,日志还在滚动
配合之前 L13 讲的日志和 L8 的进程管理,tmux 就是那个把"人"和"任务"解耦的工具:人可以走,任务必须留。
小结
装上 tmux,改掉"SSH 断了就重来"的习惯。从今天起,长任务先开会话——断线只是换了个地方接着看。