跳到主要内容

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。多数快捷键不是同时按三个键,而是:

  1. 按住 Ctrl并点一下 b
  2. 松开;
  3. 再按功能键,例如 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 脱离,不结束任务

建议给窗口起用途明确的名字,如 deploylogsmonitor,而不是同时开七个都叫 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-Zshell 向前台进程发送暂停信号,进程变成 stopped job
bg让当前 shell 中暂停的 job 在后台继续
fg把 job 拉回前台
Ctrl-b dtmux 客户端离开,但 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

这会终止该会话内的进程,执行前应先确认目标名称。