第4集:tmux — 不死会话的基石
💡 进群学习加 wx: agentupdate
(申请发送: agentupdate)
(申请发送: agentupdate)
终端复用器,跑在任何 Unix 服务器上。detach/attach 让 Agent 会话永不停歇。
tmux 是什么
tmux 不是终端模拟器。它是终端复用器——跑在终端模拟器里面。
关键区别:
- 终端模拟器(Ghostty/iTerm2/Warp):渲染图形、管理窗口,macOS/Linux 桌面应用
- 终端复用器(tmux):管理会话(session),纯命令行,跑在服务器上
┌─────────────────────────────────────┐
│ 终端模拟器 (Ghostty/iTerm2/Warp) │
│ ┌───────────────────────────────┐ │
│ │ tmux session │ │
│ │ ┌──────────┬──────────────┐ │ │
│ │ │ Agent 1 │ Agent 2 │ │ │
│ │ │ (pane) │ (pane) │ │ │
│ │ └──────────┴──────────────┘ │ │
│ └───────────────────────────────┘ │
└─────────────────────────────────────┘
安装方式
# macOS
brew install tmux
# Ubuntu/Debian
sudo apt install tmux
# CentOS/RHEL/Fedora
sudo yum install tmux
# 或
sudo dnf install tmux
# Arch Linux
sudo pacman -S tmux
# 验证安装
tmux -V
# 输出: tmux 3.5a(或更高版本)
操作系统支持
| 系统 | 支持情况 | 备注 |
|---|---|---|
| macOS | 完整 | Homebrew 安装,配合任意终端 |
| Linux | 完整 | 系统包管理器安装 |
| FreeBSD/OpenBSD | 完整 | ports/pkgng 安装 |
| Windows | WSL2 内可用 | 在 WSL2 Linux 环境内运行 |
| 远程服务器 | 完整 | 这是 tmux 的核心场景 |
三层结构
tmux 的组织结构:session → window → pane
graph TB
S[tmux server] --> SE1[Session: agent-1]
S --> SE2[Session: agent-2]
S --> SE3[Session: review]
SE1 --> W1[Window 0]
W1 --> P1[Pane: claude]
W1 --> P2[Pane: logs]
SE2 --> W2[Window 0]
W2 --> P3[Pane: claude]
SE2 --> W4[Window 1]
W4 --> P4[Pane: tests]
style S fill:#ff6b6b,color:#fff
style SE1 fill:#4a9eff,color:#fff
style P1 fill:#2ecc71,color:#fff- Session:独立的工作空间。detach 后继续运行,attach 后恢复。
- Window:Session 内的标签页。一个 Session 可有多个 Window。
- Pane:Window 内的分屏。一个 Window 可有多个 Pane。
关键操作
| 操作 | 快捷键 / 命令 | 说明 |
|---|---|---|
| 新建 Session | tmux new -s name |
创建命名会话 |
| Detach | Ctrl+b d |
断开但保留会话 |
| Attach | tmux attach -t name |
重新连接会话 |
| 列出 Sessions | tmux ls |
查看所有会话 |
| 杀掉 Session | tmux kill-session -t name |
终止会话 |
| 水平分屏 | Ctrl+b " |
上下分割 |
| 垂直分屏 | Ctrl+b % |
左右分割 |
| 切换 Pane | Ctrl+b 方向键 |
在分屏间移动 |
| 新建 Window | Ctrl+b c |
新标签页 |
| 切换 Window | Ctrl+b 0-9 |
按编号切换 |
| 同步输入 | :setw synchronize-panes |
所有 Pane 同步接收输入 |
会话生命周期
stateDiagram-v2
[*] --> Created: tmux new -s agent
Created --> Attached: 自动 attach
Attached --> Detached: Ctrl+b d
或关闭终端
Detached --> Attached: tmux attach -t agent
Attached --> Attached: 正常使用
Detached --> Running: 后台持续运行
Running --> Attached: tmux attach -t agent
Running --> Destroyed: tmux kill-session
Attached --> Destroyed: tmux kill-session
Destroyed --> [*]
note right of Running
Agent 继续运行
SSH 断线不影响
关掉笔记本不影响
end noteAgent 交互机制
tmux 提供最强大的命令行级 Agent 控制能力:
flowchart TB
subgraph 控制方式
A[tmux send-keys
命令注入]
B[tmux 命令行
session管理]
C[Socket 文件
进程间通信]
D[配置文件
~/.tmux.conf]
end
subgraph Agent会话
E[Session: agent-1]
F[Session: agent-2]
G[Session: agent-N]
end
A -->|向指定pane发送命令| E
A -->|向指定pane发送命令| F
B -->|创建/销毁/列出| E
B -->|创建/销毁/列出| G
C -->|直接socket通信| E
D -->|启动时加载配置| H[tmux server]
style A fill:#2ecc71,color:#fff
style B fill:#4a9eff,color:#fff
style C fill:#ff6b6b,color:#fff| 交互方式 | 支持情况 | 说明 |
|---|---|---|
send-keys |
完整 | 向任意 pane 注入命令/按键,最常用 |
| 命令行 | 完整 | tmux 命令管理所有 session/window/pane |
| Socket 文件 | 完整 | /tmp/tmux-*/default 直接进程间通信 |
| 配置文件 | 完整 | ~/.tmux.conf 定制快捷键、状态栏 |
| 脚本自动化 | 完整 | Bash/Python 脚本完全控制 tmux |
| 状态栏定制 | 完整 | 显示 Agent 状态、时间、系统信息 |
send-keys 自动化示例:
#!/bin/bash
# 批量启动 Claude Code Agent
# 创建 3 个 session
tmux new-session -d -s research -d 'claude'
tmux new-session -d -s coding -d 'claude'
tmux new-session -d -s review -d 'claude'
# 向 research agent 发送指令
tmux send-keys -t research '/gsd-research-phase 1' Enter
# 向 coding agent 发送指令
tmux send-keys -t coding '/gsd-execute-phase 1' Enter
# 向 review agent 发送指令
tmux send-keys -t review '/gsd-code-review' Enter
echo "3 个 Agent 已启动,使用 tmux attach -t <name> 查看"
推荐配置
~/.tmux.conf 必改项:
# 鼠标支持(滚动、点击切换 pane、调整分屏大小)
set -g mouse on
# 大缓冲区(Agent 输出很多)
set -g history-limit 100000
# 状态栏显示 session 名称
set -g status-left '#[fg=green]#S #[default]'
# 状态栏显示时间
set -g status-right '#[fg=yellow]%H:%M#[default]'
# 256 色 + 真彩色支持
set -g default-terminal "screen-256color"
set -ga terminal-overrides ",xterm-256color:Tc"
# 快速重载配置
bind r source-file ~/.tmux.conf \; display-message "配置已重载"
# 更直观的分屏快捷键
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
# 窗口编号从 1 开始
set -g base-index 1
setw -g pane-base-index 1
# 减少 ESC 延迟(影响 Vim 用户)
set -sg escape-time 0
优缺点
| 优点 | 缺点 |
|---|---|
| 会话永不丢失(detach/attach) | 学习曲线陡峭 |
| 全 Unix 平台支持 | UI 朴素,不如现代终端美观 |
| 资源占用极低(~5MB/session) | 无 Agent 通知机制 |
| send-keys 完全可编程 | 配置复杂 |
| 远程服务器标准工具 | 无 GPU 渲染(依赖宿主终端) |
| 15+ 年稳定性验证 | 快捷键记忆成本高 |
适用场景
- 远程服务器跑 Agent(核心场景)
- 多 Agent 并行 + 脚本自动化
- SSH 断线后会话保持
- 作为 Ghostty/iTerm2 的"内层"使用