Tmux 实用指南
Tmux 是终端复用器。它在远程机器上运行一个 tmux server,把工作组织成 session → window → pane:
session: vps-maintenance
├── window 0: shell
│ ├── pane 0: apt / compose 命令
│ └── pane 1: journalctl 日志
└── window 1: monitor
└── pane 0: watch / docker stats
SSH 断线时,tmux session 仍在 VPS 上;重新 SSH 后可以 attach 回去。它适合升级、构建、日志观察和较长的迁移,但不能替代备份或第二条 SSH 路径。
先记住前缀键
默认前缀是 Ctrl-b。多数快捷键不是同时按三个键,而是:
- 按住
Ctrl并点一下b; - 松开;
- 再按功能键,例如
d。
后文写成 Ctrl-b d。
最小可用流程
[REMOTE: VPS]
# 新建命名会话
tmux new -s maintenance
# 在 tmux 内正常工作
sudo apt update
# Ctrl-b d:detach,任务继续运行
# 在普通 shell 中列出并恢复
tmux ls
tmux attach -t maintenance
一个很实用的幂等入口是:
tmux new-session -A -s maintenance
会话存在就 attach,不存在就创建。
窗口和分屏
| 快捷键 | 作用 |
|---|---|
Ctrl-b c | 新建窗口 |
Ctrl-b , | 重命名当前窗口 |
Ctrl-b n / p | 下一个 / 上一个窗口 |
Ctrl-b 0..9 | 跳到指定窗口 |
Ctrl-b % | 左右分屏 |
Ctrl-b " | 上下分屏 |
Ctrl-b + 方向键 | 切换 pane |
Ctrl-b z | 当前 pane 临时全屏,再按一次恢复 |
Ctrl-b x | 关闭当前 pane,会要求确认 |
Ctrl-b d | 从 session 脱离,不结束任务 |
建议给窗口起用途明确的名字,如 deploy、logs、monitor,而不是同时开七个都叫 bash 的窗口。
查看历史输出
终端滚轮在 tmux 中不一定直接查看历史。按:
Ctrl-b [
进入 copy mode, 用方向键、Page Up/Page Down 或 Vim 风格键移动,按 q退出。只想快速查看日志时,也可以让工具直接控制输出:
journalctl -u docker -n 200 --no-pager
docker compose logs --tail 200
Ctrl-Z、detach 和退出的区别
| 操作 | 发生了什么 |
|---|---|
Ctrl-Z | shell 向前台进程发送暂停信号,进程变成 stopped job |
bg | 让当前 shell 中暂停的 job 在后台继续 |
fg | 把 job 拉回前台 |
Ctrl-b d | tmux 客户端离开,但 session 中程序继续正常运行 |
exit | 退出当前 shell;最后一个 pane 退出后 session 会结束 |
误按 Ctrl-Z 后先看:
jobs -l
fg %1 # 把编号 1 的 job 恢复到前台
# 或 bg %1 # 放到后台继续,但日志和生命周期仍属于该 shell
长期任务更适合一开始就在 tmux 内运行,而不是临时依赖 bg。
日常 VPS 布局建议
tmux new -s ops
deploy窗口:进入/srv/<service>运行 Compose。logs窗口:docker compose logs -f --tail 100。health窗口:watch -n 2 'docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"'。
不用一直保留所有窗口。一个 session 中留下清晰的当前任务,比把 tmux 变成终端阁楼更有价值。
常见问题
no sessions:会话已结束或从未创建,用tmux new -s <name>。sessions should be nested with care:已经在 tmux 内又运行 tmux;先看$TMUX,通常不需要嵌套。- attach 提示会话已连接:可用
tmux attach -d -t <name>先踢掉旧客户端再连接。 - 任务仍因重启消失:tmux只抵抗 SSH 断线,不抵抗 VPS 重启;常驻服务应由 Docker restart policy 或 systemd 管理。
- 不知道自己在哪:
tmux display-message -p '#S:#I.#P'显示 session、window、pane。
结束会话
优先在各 pane 中正常结束程序并输入 exit。明确要终止整个会话时:
tmux kill-session -t maintenance
这会终止该会话内的进程,执行前应先确认目标名称。