tmux —— 终端复用 / 长跑任务防掉线
一句话定义
tmux 让你在远程 ssh 会话之上再开一层"持久会话"——ssh 断了,远端的 tmux session 不死、任务继续跑;下次 ssh 回来 tmux attach 接上、所有状态都还在。同时它还能在一个终端里管理多窗格 / 多窗口。
典型场景
- 长跑任务(
apt upgrade/kubeadm init/helm install --wait):丢网络也不打断 - 多窗格协同:左边
kubectl logs -f、右边kubectl get pods -w - 把一个工作 session(含 8 个窗格)存下来、下次回来继续
任何在远端跑 > 30 秒的命令都该在 tmux 里跑——网络抽风时不会丢工作。
装
apt install -y tmux # Ubuntu / Debian
yum install -y tmux # CentOS / RHEL
brew install tmux # macOS
核心心智模型
tmux server (后台进程)
└─ session (会话, 可命名)
└─ window (窗口, 类似浏览器 tab)
└─ pane (窗格, 一个窗口可分多个 pane)
└─ shell (你跑命令的地方)
key:
- session 是顶层容器,ssh 断不死
- window 是 session 内的 tab
- pane 是 window 内的分割
基础动作(远程上手就这几个)
启动
tmux # 新建一个匿名 session
tmux new -s work # 命名 session "work"
进入后底部会有状态栏。
关键概念:前缀键 Ctrl-b
tmux 所有快捷键都要先按 Ctrl-b、松开、再按动作键。下面 <prefix> 都代表 Ctrl-b。
这里全程用
Ctrl-b(默认)。很多人改成Ctrl-a(按 home row 更顺),后面讲。
最常用 10 个
| 操作 | 按键 |
|---|---|
| detach(离开 session、但 session 继续跑) | <prefix> d |
| 看 session 列表 | <prefix> s |
| 新建窗口(tab) | <prefix> c |
| 切换窗口 | <prefix> n / <prefix> p(前 / 后) |
| 按数字切窗口 | <prefix> 0..9 |
| 列窗口选一个 | <prefix> w |
| 关当前窗口 | <prefix> & 或在 shell 里 exit |
| 水平分屏(上下) | <prefix> " |
| 垂直分屏(左右) | <prefix> % |
| 在窗格间切换 | <prefix> ←↑→↓ 或 <prefix> o |
| 关当前窗格 | <prefix> x 或 exit |
| 看帮助 | <prefix> ? |
Detach + Attach(核心)
tmux new -s work
# 跑各种命令、开多个窗格
# 现在 ssh 断了 / 网络抽风
# 重新 ssh 回服务器
tmux ls # 看现有 session
# work: 3 windows (created Mon May 27 14:00:00 2026)
tmux attach -t work # 接回 work
tmux a -t work # 短写
# 也可以快捷接最近一个
tmux a
session 管理
tmux ls # 列所有
tmux new -s name # 新建带名字
tmux a -t name # attach
tmux a # attach 最近的
tmux kill-session -t name # 杀 session
tmux kill-server # 杀所有 session(小心)
session 内部:
| 按键 | 作用 |
|---|---|
<prefix> d | detach |
<prefix> s | 列 session 切换 |
<prefix> $ | 重命名当前 session |
<prefix> ) / <prefix> ( | 下/上 个 session |
window 和 pane 管理
<prefix> c 新窗口
<prefix> , 重命名当前窗口
<prefix> n / p 下 / 上 窗口
<prefix> 0..9 按数字
<prefix> w 列表选
<prefix> " 水平分(上下两个窗格)
<prefix> % 垂直分(左右两个窗格)
<prefix> 方向键 切窗格
<prefix> z 最大化当前窗格(再按一次恢复)
<prefix> x 关当前窗格
<prefix> Space 切换 layout(预设布局)
<prefix> { / } 交换窗格位置
复制 / 滚动模式
终端默认 Ctrl-Shift-c 复制选中。但 tmux 接管了鼠标和滚轮 → 要进入"copy mode" 才能滚动看历史:
<prefix> [ 进入 copy / scroll mode
方向键 / PgUp / PgDn 滚动
q 退出
/ 搜索
或者开鼠标(推荐):
# ~/.tmux.conf
set -g mouse on
然后鼠标滚轮直接能滚 / 选 / 拖。
实用配置 ~/.tmux.conf
# 改前缀为 Ctrl-a(home row 更顺,类似 screen)
unbind C-b
set -g prefix C-a
bind C-a send-prefix
# 鼠标支持
set -g mouse on
# 窗口编号从 1 开始(0 在键盘最右、麻烦)
set -g base-index 1
setw -g pane-base-index 1
# 增大 history(默认 2000 行)
set -g history-limit 100000
# 状态栏
set -g status-bg colour234
set -g status-fg white
set -g status-left "#[fg=green]#S "
set -g status-right "%H:%M %d-%b-%y"
# 更顺手的分屏键
bind | split-window -h # | 竖切
bind - split-window -v # - 横切
# vim 风格的窗格切换
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
# 重载配置
bind r source-file ~/.tmux.conf \; display "Reloaded"
reload:tmux 已经在跑就 <prefix> :source-file ~/.tmux.conf,或者按你绑定的快捷键。
训练营 / SRE 实战套路
1. 长跑任务
ssh m1
tmux new -s upgrade
# 跑 kubeadm upgrade apply v1.29.3
# ssh 断了也不怕
# 网络回来
ssh m1
tmux a -t upgrade
# 继续看进度
2. 多窗格协同 debug
ssh m1
tmux new -s debug
# Ctrl-b " → 切水平
# Ctrl-b % → 切垂直
# 现在 4 个窗格:
# ┌─────────────┬─────────────┐
# │ kubectl get │ kubectl │
# │ pods -w │ logs -f │
# ├─────────────┼─────────────┤
# │ journalctl │ free 终端 │
# │ -u kubelet │ │
# └─────────────┴─────────────┘
3. session per project
每个项目 / 工程一个 session:
tmux new -s k8s-bootcamp
tmux new -s ai-infra
tmux new -s personal-blog
tmux ls
# ai-infra: ...
# k8s-bootcamp: ...
# personal-blog: ...
tmux a -t k8s-bootcamp # 切到训练营 session
4. 共享 session(结对调试)
两个人 ssh 同一台机器 / 同一账号:
# 你
tmux new -s debug
# 同事
tmux a -t debug # attach 到同一个 session
# 两人看到同一屏幕、同时输入
教学 / 结对排错神器。
进阶:tmuxinator / tmuxp / 启动脚本
为某个项目预设布局(自动开多个窗格、自动启动命令):
# .tmuxp.yaml
session_name: k8s-debug
windows:
- window_name: main
layout: tiled
panes:
- kubectl get pods -A -w
- kubectl logs -f -l app=nginx
- journalctl -u kubelet -f
- shell
tmuxp load .tmuxp.yaml
或者写 shell 脚本自动 send-keys:
#!/bin/bash
tmux new -d -s debug
tmux send-keys -t debug 'kubectl get pods -A -w' C-m
tmux split-window -t debug
tmux send-keys -t debug 'kubectl logs -f' C-m
tmux a -t debug
常见踩坑
坑 1:忘了前缀键
# 直接按 c 想新建窗口
# 没反应(c 是 shell 字符)
先 <prefix> (默认 Ctrl-b) 再动作。
坑 2:ssh 断后找不到 session
ssh m1
tmux ls
# error: no server running
可能:
- 这台机器从来没跑过 tmux(开新 session)
- 别的 ssh session 跑了 tmux server,但是用了不同 socket(极少见)
- tmux server 被 reboot 杀了(session 不持久跨 reboot)
正常 SOP:
tmux ls 2>/dev/null && tmux a || tmux new -s work
# 有就 attach、没就 new
写成 alias / shell function。
坑 3:开了鼠标后无法用 Ctrl-Shift-c 复制
set -g mouse on
鼠标接管了选择,原生终端复制失效。
修法(按发行版):
- macOS iTerm2 / Linux Alacritty:按住 Option / Shift 拖选可以绕过 tmux 直接选屏幕字符
- 或者
<prefix> [进 copy mode,选完Enter
坑 4:copy mode 退不出
<prefix> [
# 进入了 copy mode
# 不知道怎么出
按 q 或 Esc。
坑 5:session 名带空格
tmux new -s "my project"
# 接 attach 时麻烦
tmux a -t "my project"
session 名用单词 / kebab-case:my-project。
坑 6:reload 配置不生效
vim ~/.tmux.conf
# 改完
需要重新加载:
<prefix> : source-file ~/.tmux.conf
或者绑定快捷键(见上面 .tmux.conf 例子)。
坑 7:用 sudo / su 让 tmux 视角丢失
sudo su - # 进了 root
tmux new # 新 session 在 root 下
# 退出 root 再 tmux ls → 看不到(因为 socket 不同)
tmux server 是按用户的。root 和普通用户的 tmux 是两套。
坑 8:tmux 进程被 kill 全断
tmux kill-server
# 或被 OOM kill
# 所有 session 内的进程都死
tmux session 是进程,被 kill 当然全没。要真持久(跨 reboot / kill)—— 用 systemd unit 包裹 tmux。
坑 9:远程 vim 在 tmux 里颜色不对
echo $TERM
# screen-256color ← 在 tmux 里
vim 检测 $TERM、显示 256 色。但有时显示成 16 色。修:
# ~/.tmux.conf
set -g default-terminal "tmux-256color"
set -ga terminal-overrides ",xterm-256color:Tc" # 真彩色
坑 10:屏幕被 vim / less 卡住、tmux 也响应慢
某个 pane 输出爆炸(无限循环 / log -f 太密),整个 tmux 卡。<prefix> x 干掉那个 pane,或者 attach 后强制断开(ssh kill)。
替代:screen / zellij
| 工具 | 特点 |
|---|---|
tmux | 最普及、生态最好 |
screen | tmux 之前的老工具、仍在 |
zellij | 现代替代、UI 友好、Rust 写的 |
byobu | tmux 的预设配置封装 |
学 tmux 一个就够。
关联命令
- ssh —— ssh 是 tmux 的"上层",断了 tmux 救命
- systemctl —— 长跑服务用 systemd 而不是 tmux(tmux 适合人工任务)
- journalctl —— 在一个 tmux pane 里
-f看日志 screen—— tmux 的老前辈nohup/disown—— 简化版"断网不死"