AI Infra 训练营
总览
  • Day 1 · 集群起步 + CNI
  • Day 2 · 控制面 + etcd
  • Day 3 · CRD + Operator + Webhook
  • Day 4 · 存储深度
  • Day 5 · 卷扩容 + 安全
  • Day 6 · 调度 + 可观测
  • Day 7 · Harbor + ArgoCD + Mesh
  • Day 8 · AI Infra
  • Day 9 · Triton + GPU
  • Day 10 · MIG + HPA + 量化
  • Day 11 · AI Agent 端到端
  • Day 12 · 灾备
  • Day 13 · Operator + 联邦 + Mesh + RAG
  • Day 14 · CKA / CKS + 总结
  • LLM 训练手册
  • RAG + Agent 手册
  • 推理优化手册
  • 上下文工程手册
  • Agent 开发手册
  • 面试深度复盘
  • 训练 v2 深度手册
  • 心智模型
  • 看懂命令输出
  • 容器网络底层
  • K8s 网络深入
  • DNS 全套
  • 故障排查方法论
  • 心智模型
  • 容器挂载完整指南
  • K8s Volumes 大全
  • PV/PVC/CSI 深入
  • NFS 深入
  • 分布式存储概览
  • 故障排查 runbook
HiHuo 主站
GitHub
总览
  • Day 1 · 集群起步 + CNI
  • Day 2 · 控制面 + etcd
  • Day 3 · CRD + Operator + Webhook
  • Day 4 · 存储深度
  • Day 5 · 卷扩容 + 安全
  • Day 6 · 调度 + 可观测
  • Day 7 · Harbor + ArgoCD + Mesh
  • Day 8 · AI Infra
  • Day 9 · Triton + GPU
  • Day 10 · MIG + HPA + 量化
  • Day 11 · AI Agent 端到端
  • Day 12 · 灾备
  • Day 13 · Operator + 联邦 + Mesh + RAG
  • Day 14 · CKA / CKS + 总结
  • LLM 训练手册
  • RAG + Agent 手册
  • 推理优化手册
  • 上下文工程手册
  • Agent 开发手册
  • 面试深度复盘
  • 训练 v2 深度手册
  • 心智模型
  • 看懂命令输出
  • 容器网络底层
  • K8s 网络深入
  • DNS 全套
  • 故障排查方法论
  • 心智模型
  • 容器挂载完整指南
  • K8s Volumes 大全
  • PV/PVC/CSI 深入
  • NFS 深入
  • 分布式存储概览
  • 故障排查 runbook
HiHuo 主站
GitHub

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> ddetach
<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最普及、生态最好
screentmux 之前的老工具、仍在
zellij现代替代、UI 友好、Rust 写的
byobutmux 的预设配置封装

学 tmux 一个就够。


关联命令

  • ssh —— ssh 是 tmux 的"上层",断了 tmux 救命
  • systemctl —— 长跑服务用 systemd 而不是 tmux(tmux 适合人工任务)
  • journalctl —— 在一个 tmux pane 里 -f 看日志
  • screen —— tmux 的老前辈
  • nohup / disown —— 简化版"断网不死"
在 GitHub 上编辑此页