深度学习中的 tmux
📚 目录
- 第一部分:背景与动机
- 第二部分:核心概念与架构
- 第三部分:安装与环境配置
- 第四部分:基础操作全流程
- 第五部分:深度学习科研实战场景
- 第六部分:高级配置优化
- 第七部分:最佳实践与工作流
- 第八部分:常见问题与踩坑指南
- 第九部分:命令速查表
- 第十部分:扩展学习
第一部分:背景与动机
1.1 深度学习科研中的痛点
在深度学习科研工作中,我们常常遇到以下问题:
问题 1:SSH 断连导致训练中断
bash
# 典型场景
ssh user@gpu-server
python train.py --epochs 100
# 网络波动或笔记本合盖 → SSH 断开 → 训练进程被杀死 ❌
后果:
- 数小时甚至数天的训练成果丢失
- GPU 资源浪费
- 实验进度延误
问题 2:多任务并行管理困难
bash
# 需要同时运行多个实验
实验 A:ResNet-50 baseline
实验 B:ResNet-50 + 数据增强
实验 C:ResNet-101 对比实验
监控任务:nvidia-smi, tensorboard, 日志查看
挑战:
- 需要开多个 SSH 连接
- 窗口切换混乱
- 难以统一管理
问题 3:实验监控不便
bash
# 理想状态:一个屏幕同时查看
- 训练日志(左侧)
- GPU 使用率(右上)
- TensorBoard(右下)
现实问题:
- 需要多个终端窗口
- 来回切换效率低
- 难以对比实验
1.2 tmux 的核心价值
tmux(Terminal Multiplexer) 是一个终端复用器,专为解决上述问题而设计:
| 功能 | 传统 SSH | tmux | 优势 |
|---|---|---|---|
| 断连保护 | ❌ 进程随连接终止 | ✅ 会话持久化 | 训练不中断 |
| 多任务管理 | ❌ 需开多个窗口 | ✅ 单窗口多会话 | 统一管理 |
| 屏幕分割 | ❌ 依赖终端工具 | ✅ 原生支持 | 监控便捷 |
| 会话恢复 | ❌ 无法恢复 | ✅ 随时重连 | 工作连续性 |
| 团队协作 | ❌ 无法共享 | ✅ 会话共享 | 远程协助 |
1.3 与其他工具对比
tmux vs screen
bash
# 功能对比
tmux screen
分屏支持 ✅ 强大 ⚠️ 基础
配置灵活性 ✅ 高 ⚠️ 中
社区活跃度 ✅ 活跃 ⚠️ 维护模式
学习曲线 ⚠️ 陡峭 ✅ 平缓
推荐度 ⭐⭐⭐⭐⭐ ⭐⭐⭐
tmux vs nohup/后台进程
bash
# nohup 方式
nohup python train.py > train.log 2>&1 &
# 问题:无法交互查看进度、修改参数、实时监控
# tmux 方式
tmux new -s training
python train.py # 可随时查看、Ctrl+C 停止、实时调整
tmux detach # 安全分离
推荐选择:
- ✅ 科研首选:tmux(功能全面、生态完善)
- ⚠️ 简单任务:nohup(快速后台运行)
- ❌ 不推荐:screen(功能受限)
第二部分:核心概念与架构
2.1 tmux 三层结构
tmux 采用三层嵌套架构,理解这个结构是掌握 tmux 的关键:
┌─────────────────────────────────────────────────────────┐
│ tmux Server(服务器) │
│ ┌───────────────────────────────────────────────────┐ │
│ │ Session: deep-learning(会话) │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ Window 0: training(窗口) │ │ │
│ │ │ ┌─────────────┬─────────────┐ │ │ │
│ │ │ │ Pane 0 │ Pane 1 │(面板) │ │ │
│ │ │ │ train.py │ nvidia-smi │ │ │ │
│ │ │ └─────────────┴─────────────┘ │ │ │
│ │ ├─────────────────────────────────────────────┤ │ │
│ │ │ Window 1: monitoring │ │ │
│ │ │ tensorboard --logdir=./logs │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ Session: experiments │ │
│ │ ├── Window 0: exp-resnet50 │ │
│ │ ├── Window 1: exp-vit │ │
│ │ └── Window 2: baseline │ │
│ └───────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
2.2 概念详解
1️⃣ Server(服务器)
- 定义:tmux 的后台守护进程
- 特点 :
- 用户无需直接管理
- 自动启动,管理所有会话
- 即使 SSH 断开,Server 仍在运行
2️⃣ Session(会话)
-
定义:独立的工作环境,包含一组窗口
-
类比:项目或任务的工作空间
-
命名建议:
bashdeep-learning # 深度学习总项目 resnet-training # ResNet 训练实验 data-processing # 数据预处理
3️⃣ Window(窗口)
-
定义:会话内的独立"标签页"
-
类比:浏览器中的不同标签
-
典型用途:
bashWindow 0: training # 运行训练脚本 Window 1: monitoring # 监控 GPU/日志 Window 2: debugging # 调试代码 Window 3: tensorboard # 可视化
4️⃣ Pane(面板)
-
定义:窗口内的分屏区域
-
类比:分屏终端
-
常见布局:
bash# 左右分屏(训练 + GPU 监控) ┌──────────────┬──────────────┐ │ train.py │ nvidia-smi │ │ running... │ GPU: 95% │ └──────────────┴──────────────┘ # 上下左右四分屏 ┌──────────────┬──────────────┐ │ train.py │ GPU monitor │ ├──────────────┼──────────────┤ │ tail -f log │ htop │ └──────────────┴──────────────┘
2.3 术语对照表
| 中文 | 英文 | 快捷键前缀 | 说明 |
|---|---|---|---|
| 会话 | Session | - | 最外层,持久化单元 |
| 窗口 | Window | Ctrl+b c |
中间层,类似标签页 |
| 面板 | Pane | Ctrl+b % |
最内层,屏幕分割 |
| 分离 | Detach | Ctrl+b d |
退出但保持运行 |
| 附加 | Attach | - | 重新连接会话 |
| 前缀键 | Prefix | Ctrl+b |
快捷键触发器 |
2.4 工作原理示意
bash
# 工作流示意
用户 SSH 登录 → tmux 创建会话 → 运行训练脚本 → 分离会话
↓ ↓
SSH 断开(网络、关机) tmux 会话继续运行
↓ ↓
重新 SSH 登录 → tmux attach → 恢复到训练界面 ✅
第三部分:安装与环境配置
3.1 安装 tmux
Ubuntu/Debian 系统
bash
# 更新包列表
sudo apt update
# 安装 tmux
sudo apt install tmux -y
# 验证安装
tmux -V
# 输出示例:tmux 3.0a
CentOS/RHEL 系统
bash
# 使用 yum
sudo yum install tmux -y
# 或使用 dnf(CentOS 8+)
sudo dnf install tmux -y
# 验证
tmux -V
macOS 系统
bash
# 使用 Homebrew
brew install tmux
# 验证
tmux -V
从源码编译(获取最新版)
bash
# 安装依赖
sudo apt install -y libevent-dev ncurses-dev build-essential bison pkg-config
# 下载源码
cd /tmp
wget https://github.com/tmux/tmux/releases/download/3.3a/tmux-3.3a.tar.gz
tar -zxf tmux-3.3a.tar.gz
cd tmux-3.3a
# 编译安装
./configure && make
sudo make install
# 验证
tmux -V
3.2 验证安装
bash
# 检查版本
tmux -V
# 快速测试
tmux new -s test # 创建测试会话
# 在 tmux 内按 Ctrl+b 然后按 d 退出
tmux ls # 查看会话列表
tmux kill-session -t test # 删除测试会话
3.3 配置文件位置
tmux 配置文件路径:
bash
# 全局配置(影响所有用户)
/etc/tmux.conf
# 用户配置(推荐,仅影响当前用户)
~/.tmux.conf
# 检查是否存在
ls -lh ~/.tmux.conf
# 如不存在,创建配置文件
touch ~/.tmux.conf
3.4 基础环境检查
bash
# 检查 shell 类型
echo $SHELL
# 推荐:/bin/bash 或 /bin/zsh
# 检查是否支持 256 色
echo $TERM
# 应输出:xterm-256color 或 screen-256color
# 如果不支持,添加到 ~/.bashrc 或 ~/.zshrc
echo 'export TERM=xterm-256color' >> ~/.bashrc
source ~/.bashrc
第四部分:基础操作全流程
4.1 快捷键前缀机制
tmux 所有快捷键都需要先按前缀键 (默认 Ctrl+b),然后再按功能键。
bash
# 标准操作流程
1. 按住 Ctrl,同时按 b
2. 松开 Ctrl 和 b
3. 按功能键(如 c 创建窗口)
# 示例:创建新窗口
Ctrl+b → c → 新窗口创建成功
⚠️ 注意:前缀键按完后需松开,再按功能键!
4.2 会话管理
创建会话
bash
# 方式 1:创建匿名会话
tmux
# 方式 2:创建命名会话(推荐)
tmux new -s deep-learning
# 方式 3:创建并指定窗口名称
tmux new -s training -n experiment-1
# 方式 4:创建并执行命令
tmux new -s monitoring -d 'nvidia-smi -l 1'
查看会话列表
bash
# 命令行查看
tmux ls
# 输出示例:
# deep-learning: 3 windows (created Thu Jan 11 10:23:45 2025)
# experiments: 1 windows (created Thu Jan 11 11:05:12 2025)
# 快捷键查看(在 tmux 内)
Ctrl+b s
# 显示交互式会话列表,用方向键选择
附加到会话
bash
# 附加到最近的会话
tmux attach
# 附加到指定会话
tmux attach -t deep-learning
# 简写
tmux a -t deep-learning
# 强制附加(踢出其他连接)
tmux attach -dt deep-learning
分离会话
bash
# 快捷键分离(推荐)
Ctrl+b d
# 命令行分离
tmux detach
切换会话
bash
# 快捷键切换
Ctrl+b s # 显示会话列表,选择切换
Ctrl+b ( # 切换到上一个会话
Ctrl+b ) # 切换到下一个会话
# 命令行切换
tmux switch -t experiments
重命名会话
bash
# 快捷键重命名
Ctrl+b $
# 命令行重命名
tmux rename-session -t old-name new-name
销毁会话
bash
# 命令行销毁
tmux kill-session -t deep-learning
# 销毁所有会话
tmux kill-server
# 在会话内退出(所有窗口都退出后会话自动销毁)
exit
4.3 窗口管理
创建窗口
bash
# 快捷键创建
Ctrl+b c # 创建新窗口
# 命令行创建
tmux new-window -n monitoring
切换窗口
bash
# 快捷键切换
Ctrl+b 0-9 # 切换到指定编号的窗口
Ctrl+b n # 切换到下一个窗口(next)
Ctrl+b p # 切换到上一个窗口(previous)
Ctrl+b l # 切换到最近使用的窗口(last)
Ctrl+b w # 显示窗口列表选择
重命名窗口
bash
# 快捷键重命名
Ctrl+b ,
# 命令行重命名
tmux rename-window monitoring
关闭窗口
bash
# 快捷键关闭
Ctrl+b & # 关闭当前窗口(有确认提示)
# 直接退出
exit # 退出当前窗口的 shell
# 命令行关闭
tmux kill-window -t 2
4.4 面板管理
分割面板
bash
# 垂直分割(左右分屏)
Ctrl+b %
# 水平分割(上下分屏)
Ctrl+b "
# 示意图
原始窗口 垂直分割 % 水平分割 "
┌────────┐ ┌────┬────┐ ┌────────┐
│ │ → │ │ │ 或 │ │
│ │ │ │ │ ├────────┤
└────────┘ └────┴────┘ └────────┘
切换面板
bash
# 快捷键切换
Ctrl+b o # 切换到下一个面板
Ctrl+b ; # 切换到上一个活动的面板
Ctrl+b ↑↓←→ # 方向键切换到指定方向的面板
# 显示面板编号并切换
Ctrl+b q
# 快速按对应数字键切换
调整面板大小
bash
# 按住 Ctrl+b,然后按住 Ctrl,再按方向键
Ctrl+b Ctrl+↑ # 向上扩大
Ctrl+b Ctrl+↓ # 向下扩大
Ctrl+b Ctrl+← # 向左扩大
Ctrl+b Ctrl+→ # 向右扩大
# 或按住前缀键,然后按 Alt+方向键(部分终端)
Ctrl+b Alt+↑↓←→
面板布局
bash
# 快捷键切换预设布局
Ctrl+b Space # 循环切换布局
# 常见布局
even-horizontal # 水平均分
even-vertical # 垂直均分
main-horizontal # 主面板在上
main-vertical # 主面板在左
tiled # 平铺
关闭面板
bash
# 快捷键关闭
Ctrl+b x # 关闭当前面板(有确认提示)
# 直接退出
exit # 退出当前面板的 shell
面板与窗口转换
bash
# 将当前面板转为新窗口
Ctrl+b !
# 将其他窗口的面板合并到当前窗口
Ctrl+b :
join-pane -s 2.0 # 将窗口 2 的面板 0 合并到当前窗口
4.5 复制模式(查看历史输出)
bash
# 进入复制模式
Ctrl+b [
# 在复制模式中
↑↓←→ # 移动光标
PageUp/Down # 翻页
Space # 开始选择
Enter # 复制选中内容并退出
q # 退出复制模式
# 粘贴复制的内容
Ctrl+b ]
4.6 命令模式
bash
# 进入命令模式
Ctrl+b :
# 常用命令示例
:new-window -n test # 创建名为 test 的窗口
:split-window -h # 水平分割面板
:resize-pane -D 5 # 向下调整面板 5 行
:set mouse on # 开启鼠标支持
第五部分:深度学习科研实战场景
5.1 场景 1:启动长时间训练任务
问题场景
bash
# 传统方法的问题
ssh user@gpu-server
python train.py --epochs 100 --batch-size 64
# 问题:
# 1. 训练需要 48 小时
# 2. 笔记本可能休眠
# 3. 网络可能波动
# 4. SSH 一断开,训练就中止 ❌
tmux 解决方案
步骤 1:创建训练会话
bash
# SSH 登录服务器
ssh user@gpu-server
# 创建命名会话
tmux new -s resnet50-training
步骤 2:激活环境并准备
bash
# 在 tmux 会话内
# 激活 conda 环境
conda activate pytorch
# 检查 GPU
nvidia-smi
# 进入项目目录
cd /home/user/projects/image-classification
步骤 3:启动训练
bash
# 运行训练脚本
python train.py \
--model resnet50 \
--dataset imagenet \
--epochs 100 \
--batch-size 256 \
--lr 0.1 \
--gpu 0,1,2,3 \
--save-dir ./checkpoints/resnet50 \
--log-dir ./logs/resnet50
# 训练开始输出
Epoch [1/100] - Loss: 2.345, Acc: 0.234
Epoch [2/100] - Loss: 2.123, Acc: 0.345
...
步骤 4:安全分离
bash
# 按快捷键分离会话
Ctrl+b d
# 此时你会回到普通 shell
# 训练继续在后台运行 ✅
# 可以安全退出 SSH
exit
步骤 5:随时恢复查看
bash
# 第二天或任何时候重新 SSH 登录
ssh user@gpu-server
# 查看会话列表
tmux ls
# resnet50-training: 1 windows (created Wed Jan 10 14:23:45 2025)
# 重新附加到会话
tmux attach -t resnet50-training
# 立即看到训练进度!
Epoch [78/100] - Loss: 0.234, Acc: 0.923
Epoch [79/100] - Loss: 0.231, Acc: 0.925
5.2 场景 2:多实验并行管理
问题场景
bash
# 需要同时运行 3 个对比实验
实验 A:ResNet-50 baseline
实验 B:ResNet-50 + MixUp
实验 C:ResNet-101 + CutMix
# 传统方法:需要开 3 个 SSH 窗口,管理混乱 ❌
tmux 解决方案
步骤 1:创建项目会话
bash
tmux new -s image-classification
步骤 2:创建实验窗口
bash
# 窗口 0:实验 A(当前窗口自动重命名)
Ctrl+b ,
# 输入:exp-a-baseline
# 创建窗口 1:实验 B
Ctrl+b c
Ctrl+b ,
# 输入:exp-b-mixup
# 创建窗口 2:实验 C
Ctrl+b c
Ctrl+b ,
# 输入:exp-c-cutmix
# 创建窗口 3:监控窗口
Ctrl+b c
Ctrl+b ,
# 输入:monitoring
步骤 3:在各窗口启动训练
bash
# 切换到窗口 0
Ctrl+b 0
conda activate pytorch
python train.py --config configs/baseline.yaml --gpu 0
# 切换到窗口 1
Ctrl+b 1
conda activate pytorch
python train.py --config configs/mixup.yaml --gpu 1
# 切换到窗口 2
Ctrl+b 2
conda activate pytorch
python train.py --config configs/cutmix.yaml --gpu 2,3
步骤 4:设置监控窗口
bash
# 切换到窗口 3(监控)
Ctrl+b 3
# 垂直分割(左右分屏)
Ctrl+b %
# 左侧:GPU 监控
watch -n 1 nvidia-smi
# 切换到右侧面板
Ctrl+b o
# 右侧再水平分割(上下分屏)
Ctrl+b "
# 右上:实验 A 日志
tail -f logs/baseline/train.log
# 切换到右下面板
Ctrl+b o
# 右下:实验 B 日志
tail -f logs/mixup/train.log
最终布局
┌──────────────────────┬──────────────────────┐
│ │ Exp A: train.log │
│ nvidia-smi │ Epoch 45/100 │
│ GPU 0: 95% │ Loss: 0.234 │
│ GPU 1: 93% ├──────────────────────┤
│ GPU 2: 98% │ Exp B: train.log │
│ GPU 3: 96% │ Epoch 42/100 │
│ │ Loss: 0.198 │
└──────────────────────┴──────────────────────┘
窗口列表:
0: exp-a-baseline
1: exp-b-mixup
2: exp-c-cutmix
3: monitoring* (当前窗口)
步骤 5:快速切换查看
bash
# 按数字键快速切换窗口
Ctrl+b 0 # 查看实验 A
Ctrl+b 1 # 查看实验 B
Ctrl+b 2 # 查看实验 C
Ctrl+b 3 # 回到监控面板
# 分离会话
Ctrl+b d
5.3 场景 3:实时监控系统资源
完整监控面板设置
步骤 1:创建监控会话
bash
tmux new -s monitoring
步骤 2:设计 4 分屏布局
bash
# 垂直分割(左右)
Ctrl+b %
# 左侧水平分割(上下)
Ctrl+b "
# 切换到右侧
Ctrl+b →
# 右侧水平分割
Ctrl+b "
步骤 3:各面板功能配置
bash
# 左上:训练日志
Ctrl+b ↑ ↑ # 切换到左上面板
tail -f /path/to/train.log
# 左下:GPU 实时监控
Ctrl+b ↓ # 切换到左下
watch -n 1 nvidia-smi
# 右上:系统资源
Ctrl+b → ↑ # 切换到右上
htop
# 右下:TensorBoard 日志
Ctrl+b ↓
tail -f tensorboard.log
最终 4 分屏布局
┌─────────────────────────┬─────────────────────────┐
│ 训练日志 │ 系统资源(htop) │
│ Epoch [85/100] │ CPU: 45% │
│ Loss: 0.234 │ Mem: 32GB/64GB │
│ Acc: 0.923 │ Processes: 234 │
├─────────────────────────┼─────────────────────────┤
│ GPU 监控 │ TensorBoard 日志 │
│ GPU 0: 98% | 11178MB │ Serving on │
│ GPU 1: 95% | 10892MB │ http://localhost:6006 │
│ Temp: 76°C / 78°C │ Loaded 1234 events │
└─────────────────────────┴─────────────────────────┘
5.4 场景 4:断网恢复与会话保护
模拟断网场景
初始状态:训练中
bash
# 在 tmux 会话中训练
tmux new -s training
python train.py --epochs 100
# 训练输出
Epoch [45/100] - Loss: 0.345, Acc: 0.876
Epoch [46/100] - Loss: 0.342, Acc: 0.879
...
# 分离会话
Ctrl+b d
模拟网络中断
bash
# SSH 连接意外断开(网络波动、笔记本休眠等)
# 传统方式:训练进程被杀死 ❌
# tmux 方式:训练继续运行 ✅
恢复连接后
bash
# 重新 SSH 登录
ssh user@gpu-server
# 查看会话(确认训练仍在运行)
tmux ls
# training: 1 windows (created Wed Jan 10 14:23:45 2025)
# 重新附加
tmux attach -t training
# 看到训练继续了!
Epoch [67/100] - Loss: 0.198, Acc: 0.934
Epoch [68/100] - Loss: 0.195, Acc: 0.936
查看历史输出
bash
# 如果想看断开期间的输出
Ctrl+b [ # 进入复制模式
PageUp # 向上翻页查看历史
q # 退出复制模式
5.5 场景 5:团队协作与会话共享
场景:远程协助调试
导师/同事帮忙调试模型
学生端:创建共享会话
bash
# 创建会话
tmux new -s debug-session
# 运行有问题的代码
python buggy_model.py
# 报错:RuntimeError: CUDA out of memory
# 告知导师会话名称:"debug-session"
导师端:附加到同一会话
bash
# SSH 登录到同一服务器
ssh user@gpu-server
# 附加到学生的会话
tmux attach -t debug-session
# 导师和学生看到完全相同的界面!
# 导师可以:
# - 查看报错信息
# - 输入命令调试
# - 修改代码
# 学生实时看到导师的操作
只读模式(仅观看)
bash
# 如果只想观看不操作
tmux attach -t debug-session -r
多人协作注意事项
bash
# 查看当前会话的连接数
tmux list-clients
# 强制踢出其他连接(慎用)
tmux attach -dt debug-session
第六部分:高级配置优化
6.1 完整 .tmux.conf 配置文件
以下是专为深度学习科研优化的配置文件,复制到 ~/.tmux.conf 即可使用。
bash
# ============================================================
# tmux 配置文件 - 深度学习科研优化版
# 文件位置: ~/.tmux.conf
# 作者: AI Research Lab
# 更新: 2025-01
# ============================================================
# ===== 基础设置 =====
# 设置默认 shell
set-option -g default-shell /bin/bash
# 启用 256 色终端
set -g default-terminal "screen-256color"
# 设置历史缓冲区大小(用于回滚查看)
set -g history-limit 50000
# 设置窗口和面板索引从 1 开始(0 在键盘太远)
set -g base-index 1
setw -g pane-base-index 1
# 窗口关闭后自动重新编号
set -g renumber-windows on
# 设置终端标题
set -g set-titles on
set -g set-titles-string '#H:#S.#I.#P #W #T'
# ===== 前缀键设置 =====
# 默认前缀键 Ctrl+b(可改为 Ctrl+a,类似 screen)
# unbind C-b
# set -g prefix C-a
# bind C-a send-prefix
# 快速重载配置文件
bind r source-file ~/.tmux.conf \; display "配置已重载!"
# ===== 鼠标支持 =====
# 启用鼠标(点击切换面板、调整大小、滚动)
set -g mouse on
# 鼠标选择文本时自动复制到系统剪贴板(macOS)
# set -g mouse-select-pane on
# set -g mouse-resize-pane on
# set -g mouse-select-window on
# ===== 快捷键优化 =====
# 分割窗口(更直观的快捷键)
bind | split-window -h -c "#{pane_current_path}" # 垂直分割
bind - split-window -v -c "#{pane_current_path}" # 水平分割
# 使用 Vim 风格的面板切换
bind h select-pane -L # 左
bind j select-pane -D # 下
bind k select-pane -U # 上
bind l select-pane -R # 右
# 使用 Alt+方向键切换面板(无需前缀键)
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D
# 使用 Ctrl+方向键调整面板大小
bind -r C-h resize-pane -L 5
bind -r C-j resize-pane -D 5
bind -r C-k resize-pane -U 5
bind -r C-l resize-pane -R 5
# 快速切换到上一个窗口
bind a last-window
# ===== 复制模式优化 =====
# 使用 Vi 模式
setw -g mode-keys vi
# Vi 风格的复制粘贴
bind -T copy-mode-vi v send-keys -X begin-selection
bind -T copy-mode-vi y send-keys -X copy-selection-and-cancel
bind -T copy-mode-vi r send-keys -X rectangle-toggle
# 粘贴
bind p paste-buffer
# ===== 状态栏美化 =====
# 状态栏位置
set -g status-position bottom
# 状态栏刷新间隔(秒)
set -g status-interval 5
# 状态栏对齐方式
set -g status-justify left
# 状态栏样式
set -g status-style fg=colour137,bg=colour234,dim
# 左侧状态栏:会话名称
set -g status-left '#[fg=colour233,bg=colour245,bold] #S #[fg=colour245,bg=colour234] '
set -g status-left-length 20
# 右侧状态栏:主机名、日期时间
set -g status-right '#[fg=colour233,bg=colour241,bold] %Y-%m-%d #[fg=colour233,bg=colour245,bold] %H:%M:%S '
set -g status-right-length 50
# 窗口状态栏样式
setw -g window-status-current-style fg=colour81,bg=colour238,bold
setw -g window-status-current-format ' #I#[fg=colour250]:#[fg=colour255]#W#[fg=colour50]#F '
setw -g window-status-style fg=colour138,bg=colour235,none
setw -g window-status-format ' #I#[fg=colour237]:#[fg=colour250]#W#[fg=colour244]#F '
# ===== 面板样式 =====
# 面板边框颜色
set -g pane-border-style fg=colour238
set -g pane-active-border-style fg=colour51
# 面板编号显示时间(毫秒)
set -g display-panes-time 2000
# ===== 消息样式 =====
set -g message-style fg=colour232,bg=colour166,bold
set -g message-command-style fg=blue,bg=black
# ===== 其他优化 =====
# 减少 ESC 键延迟(Vim 用户重要)
set -sg escape-time 0
# 允许自动重命名窗口
setw -g automatic-rename on
# 窗口活动监控
setw -g monitor-activity on
set -g visual-activity off
# 设置窗口名称不自动更新(手动命名后保持)
set -g allow-rename off
# ===== 插件管理(TPM) =====
# TPM 插件管理器(需要先安装 TPM)
# git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
# 插件列表
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'tmux-plugins/tmux-resurrect' # 会话保存/恢复
set -g @plugin 'tmux-plugins/tmux-continuum' # 自动保存会话
set -g @plugin 'tmux-plugins/tmux-yank' # 复制到系统剪贴板
set -g @plugin 'tmux-plugins/tmux-cpu' # CPU 监控
set -g @plugin 'tmux-plugins/tmux-battery' # 电池状态(笔记本)
# tmux-resurrect 配置
set -g @resurrect-capture-pane-contents 'on' # 恢复面板内容
set -g @resurrect-strategy-vim 'session' # Vim 会话恢复
set -g @resurrect-save-shell-history 'on' # 保存 shell 历史
# tmux-continuum 配置
set -g @continuum-restore 'on' # 启动时自动恢复
set -g @continuum-save-interval '15' # 每 15 分钟自动保存
# 初始化 TPM(保持在配置文件末尾)
run '~/.tmux/plugins/tpm/tpm'
# ============================================================
# 深度学习专用快捷键
# ============================================================
# 快速启动 nvidia-smi 监控
bind g split-window -h "watch -n 1 nvidia-smi"
# 快速启动 htop
bind H split-window -h "htop"
# 快速查看 GPU 温度
bind t split-window -h "watch -n 1 'nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader,nounits'"
# ============================================================
# 使用说明
# ============================================================
# 1. 复制此文件到 ~/.tmux.conf
# 2. 在 tmux 中按 Ctrl+b 然后按 r 重载配置
# 3. 安装 TPM: git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
# 4. 在 tmux 中按 Ctrl+b 然后按 I(大写)安装插件
# ============================================================
6.2 安装和使用 TPM 插件管理器
安装 TPM
bash
# 克隆 TPM 到本地
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
# 重载 tmux 配置
tmux source ~/.tmux.conf
安装插件
bash
# 在 tmux 会话中
Ctrl+b I # 大写 I,安装插件
# 等待安装完成
# 插件会自动下载到 ~/.tmux/plugins/
常用插件功能
1. tmux-resurrect(会话保存/恢复)
bash
# 保存当前所有会话
Ctrl+b Ctrl+s
# 恢复之前保存的会话
Ctrl+b Ctrl+r
# 使用场景:服务器重启后恢复工作环境
2. tmux-continuum(自动保存)
bash
# 自动每 15 分钟保存一次会话
# 重启 tmux 后自动恢复
# 无需手动操作
3. tmux-yank(复制到系统剪贴板)
bash
# 在复制模式中
Ctrl+b [ # 进入复制模式
Space # 开始选择
Enter # 复制并自动复制到系统剪贴板
# 可在其他应用中直接 Ctrl+V 粘贴
6.3 科研场景专用配置
GPU 监控集成
在 .tmux.conf 中添加:
bash
# 一键启动完整监控布局
bind M split-window -h -p 50 \; \
split-window -v -p 50 \; \
select-pane -t 0 \; \
split-window -v -p 50 \; \
select-pane -t 0 \; \
send-keys 'tail -f train.log' C-m \; \
select-pane -t 1 \; \
send-keys 'watch -n 1 nvidia-smi' C-m \; \
select-pane -t 2 \; \
send-keys 'htop' C-m \; \
select-pane -t 3 \; \
send-keys 'python -m tensorboard.main --logdir=./logs' C-m
使用方法:
bash
# 在 tmux 中按
Ctrl+b M # 大写 M
# 自动创建 4 分屏监控布局
自动保存训练日志
bash
# 创建日志保存脚本
cat > ~/.tmux/scripts/capture-pane.sh << 'EOF'
#!/bin/bash
# 捕获当前面板输出到文件
tmux capture-pane -pS - > ~/tmux-logs/$(date +%Y%m%d-%H%M%S).log
EOF
chmod +x ~/.tmux/scripts/capture-pane.sh
# 在 .tmux.conf 中绑定快捷键
bind C-l run-shell "~/.tmux/scripts/capture-pane.sh" \; \
display "日志已保存到 ~/tmux-logs/"
第七部分:最佳实践与工作流
7.1 科研项目的 tmux 组织策略
推荐的命名规范
bash
# 会话命名:项目名称
deep-learning
object-detection
nlp-research
# 窗口命名:任务类型
0: training
1: monitoring
2: tensorboard
3: data-processing
4: debugging
# 示例:完整项目结构
会话: image-classification
├── 窗口 0: exp-baseline
├── 窗口 1: exp-augmentation
├── 窗口 2: exp-architecture
├── 窗口 3: monitoring
└── 窗口 4: analysis
多项目管理
bash
# 为不同项目创建独立会话
tmux new -s project-a
tmux new -s project-b
tmux new -s project-c
# 快速切换
Ctrl+b s # 显示会话列表
# 选择需要的项目
# 批量管理
tmux ls # 查看所有项目
tmux kill-session -t old # 清理旧项目
7.2 自动化启动脚本
实验启动脚本
创建 start_training.sh:
bash
#!/bin/bash
# 自动创建训练环境
SESSION_NAME="training-$(date +%Y%m%d-%H%M)"
# 创建会话
tmux new-session -d -s $SESSION_NAME
# 窗口 0:训练脚本
tmux rename-window -t $SESSION_NAME:0 'training'
tmux send-keys -t $SESSION_NAME:0 'conda activate pytorch' C-m
tmux send-keys -t $SESSION_NAME:0 'cd ~/projects/image-classification' C-m
tmux send-keys -t $SESSION_NAME:0 'python train.py --config configs/resnet50.yaml' C-m
# 窗口 1:监控
tmux new-window -t $SESSION_NAME:1 -n 'monitoring'
tmux send-keys -t $SESSION_NAME:1 'watch -n 1 nvidia-smi' C-m
# 窗口 2:日志
tmux new-window -t $SESSION_NAME:2 -n 'logs'
tmux send-keys -t $SESSION_NAME:2 'tail -f logs/train.log' C-m
# 窗口 3:TensorBoard
tmux new-window -t $SESSION_NAME:3 -n 'tensorboard'
tmux send-keys -t $SESSION_NAME:3 'conda activate pytorch' C-m
tmux send-keys -t $SESSION_NAME:3 'tensorboard --logdir=./logs --port=6006' C-m
# 附加到会话
tmux attach-session -t $SESSION_NAME
使用方法:
bash
chmod +x start_training.sh
./start_training.sh
监控面板脚本
创建 start_monitoring.sh:
bash
#!/bin/bash
# 自动创建监控面板
SESSION_NAME="monitoring"
# 检查会话是否存在
tmux has-session -t $SESSION_NAME 2>/dev/null
if [ $? != 0 ]; then
# 创建会话
tmux new-session -d -s $SESSION_NAME
# 分割面板
tmux split-window -h -t $SESSION_NAME:0
tmux split-window -v -t $SESSION_NAME:0.0
tmux split-window -v -t $SESSION_NAME:0.2
# 左上:训练日志
tmux send-keys -t $SESSION_NAME:0.0 'tail -f logs/train.log' C-m
# 左下:GPU 监控
tmux send-keys -t $SESSION_NAME:0.1 'watch -n 1 nvidia-smi' C-m
# 右上:系统资源
tmux send-keys -t $SESSION_NAME:0.2 'htop' C-m
# 右下:GPU 温度
tmux send-keys -t $SESSION_NAME:0.3 \
'watch -n 1 "nvidia-smi --query-gpu=temperature.gpu,utilization.gpu,memory.used,memory.total --format=csv"' C-m
fi
# 附加到会话
tmux attach-session -t $SESSION_NAME
7.3 与其他工具集成
与 Conda 环境配合
bash
# 方法 1:在 .bashrc 中自动激活
# 确保每次启动 tmux 面板时环境已激活
echo 'conda activate pytorch' >> ~/.bashrc
# 方法 2:在 tmux 窗口启动时激活
tmux new-window -n 'training' 'conda activate pytorch && bash'
# 方法 3:设置 hook(推荐)
# 在 .tmux.conf 中添加
set-hook -g after-new-window 'send-keys "conda activate pytorch" C-m'
与 Weights & Biases (wandb) 配合
bash
# 创建专用窗口查看 wandb 日志
tmux new-window -n 'wandb'
tmux send-keys 'watch -n 5 "wandb status"' C-m
与 VSCode Remote 配合
bash
# VSCode 内集成终端可以使用 tmux
# 在 VSCode 设置中添加
"terminal.integrated.shell.linux": "/usr/bin/tmux"
# 或创建 tmux 专用终端
# 打开新终端 → 运行命令:tmux
与 Jupyter Notebook 配合
bash
# 在 tmux 中启动 Jupyter
tmux new -s jupyter
jupyter notebook --no-browser --port=8888
# 分离会话
Ctrl+b d
# SSH 端口转发(本地机器)
ssh -L 8888:localhost:8888 user@gpu-server
# 在浏览器访问
http://localhost:8888
7.4 实验日志管理
自动记录实验信息
创建实验启动模板:
bash
#!/bin/bash
# experiment_runner.sh
EXPERIMENT_NAME=$1
CONFIG_FILE=$2
if [ -z "$EXPERIMENT_NAME" ] || [ -z "$CONFIG_FILE" ]; then
echo "用法: ./experiment_runner.sh <实验名称> <配置文件>"
exit 1
fi
# 创建实验目录
EXP_DIR="experiments/${EXPERIMENT_NAME}_$(date +%Y%m%d_%H%M%S)"
mkdir -p $EXP_DIR
# 保存配置文件
cp $CONFIG_FILE $EXP_DIR/config.yaml
# 创建 tmux 会话
SESSION_NAME="exp-${EXPERIMENT_NAME}"
tmux new-session -d -s $SESSION_NAME
# 记录实验信息
tmux send-keys -t $SESSION_NAME \
"echo '实验名称: $EXPERIMENT_NAME' | tee $EXP_DIR/experiment.log" C-m
tmux send-keys -t $SESSION_NAME \
"echo '开始时间: $(date)' | tee -a $EXP_DIR/experiment.log" C-m
tmux send-keys -t $SESSION_NAME \
"echo '配置文件: $CONFIG_FILE' | tee -a $EXP_DIR/experiment.log" C-m
# 启动训练
tmux send-keys -t $SESSION_NAME \
"conda activate pytorch" C-m
tmux send-keys -t $SESSION_NAME \
"python train.py --config $CONFIG_FILE --save-dir $EXP_DIR | tee -a $EXP_DIR/train.log" C-m
# 附加到会话
tmux attach-session -t $SESSION_NAME
使用方法:
bash
./experiment_runner.sh resnet50-baseline configs/baseline.yaml
第八部分:常见问题与踩坑指南
8.1 环境变量丢失问题
问题表现
bash
# 在 tmux 外
echo $CUDA_VISIBLE_DEVICES
# 输出:0,1,2,3
# 在 tmux 内
echo $CUDA_VISIBLE_DEVICES
# 输出:(空)❌
原因
tmux 会话创建时会重新加载 shell 环境,可能丢失某些环境变量。
解决方案
方法 1:在 .bashrc 中设置
bash
# 编辑 ~/.bashrc
echo 'export CUDA_VISIBLE_DEVICES=0,1,2,3' >> ~/.bashrc
source ~/.bashrc
# 重启 tmux 会话
tmux kill-server
tmux
方法 2:创建会话时传递环境变量
bash
CUDA_VISIBLE_DEVICES=0,1,2,3 tmux new -s training
方法 3:在 .tmux.conf 中设置
bash
set-environment -g CUDA_VISIBLE_DEVICES "0,1,2,3"
8.2 鼠标复制粘贴问题
问题表现
启用 tmux 鼠标支持后,无法直接复制文本到系统剪贴板。
解决方案
方法 1:按住 Shift 选择文本
bash
# 在 tmux 中
# 按住 Shift 键 + 鼠标选择
# 然后 Ctrl+Shift+C 复制(或右键复制)
方法 2:使用 tmux-yank 插件
bash
# 安装 tmux-yank(已在配置文件中)
# 在复制模式中
Ctrl+b [
Space # 开始选择
Enter # 自动复制到系统剪贴板
方法 3:临时禁用鼠标
bash
# 在 tmux 中
Ctrl+b :
set -g mouse off
# 复制完成后重新启用
Ctrl+b :
set -g mouse on
8.3 颜色显示异常
问题表现
bash
# Vim、htop 等程序颜色显示不正常
# 或显示乱码字符
解决方案
检查 TERM 变量
bash
# 在 tmux 外
echo $TERM
# 应该是:xterm-256color
# 在 tmux 内
echo $TERM
# 应该是:screen-256color 或 tmux-256color
修复方法
bash
# 方法 1:在 .tmux.conf 中设置
set -g default-terminal "screen-256color"
# 方法 2:强制使用 256 色
set -g default-terminal "tmux-256color"
# 方法 3:在 .bashrc 中设置
echo 'export TERM=xterm-256color' >> ~/.bashrc
8.4 中文显示问题
问题表现
中文显示为乱码或方框。
解决方案
检查 locale
bash
locale
# 应包含 UTF-8
# 如果不是,设置 locale
echo 'export LANG=en_US.UTF-8' >> ~/.bashrc
echo 'export LC_ALL=en_US.UTF-8' >> ~/.bashrc
source ~/.bashrc
在 .tmux.conf 中设置
bash
set -g status-utf8 on # tmux < 2.2
set -g utf8 on # tmux < 2.2
# tmux >= 2.2 会自动检测 UTF-8
8.5 会话意外退出
问题表现
tmux 会话突然消失,训练中断。
常见原因
1. 所有窗口都退出
bash
# 如果关闭了所有窗口,会话自动销毁
# 解决:至少保留一个窗口
2. 服务器重启
bash
# 服务器重启会清除所有 tmux 会话
# 解决:使用 tmux-resurrect 自动恢复
3. tmux 服务崩溃
bash
# 检查日志
journalctl -u tmux
# 重启 tmux 服务
tmux kill-server
tmux
预防措施
bash
# 使用 tmux-continuum 自动保存
# 在 .tmux.conf 中
set -g @continuum-restore 'on'
set -g @continuum-save-interval '15'
# 手动保存会话
Ctrl+b Ctrl+s
8.6 性能问题
问题表现
tmux 响应变慢,输入延迟。
常见原因和解决
1. 历史缓冲过大
bash
# 减少历史缓冲
set -g history-limit 10000 # 默认 50000
2. 状态栏更新过于频繁
bash
# 降低刷新频率
set -g status-interval 10 # 默认 5 秒
3. 面板数量过多
bash
# 限制面板数量
# 建议每个窗口不超过 4 个面板
4. 插件过多
bash
# 禁用不必要的插件
# 注释掉 .tmux.conf 中的插件行
# set -g @plugin 'xxx'
8.7 SSH 连接断开后无法重连
问题表现
bash
tmux attach
# 报错:no sessions
排查步骤
1. 检查会话是否存在
bash
tmux ls
# 如果没有输出,说明会话已被清理
2. 检查 tmux 服务是否运行
bash
ps aux | grep tmux
# 应该看到 tmux 进程
3. 检查 socket 文件
bash
ls -lh /tmp/tmux-$(id -u)/
# 应该有 socket 文件
4. 恢复会话(如果使用了 tmux-resurrect)
bash
tmux
Ctrl+b Ctrl+r # 恢复上次保存的会话
第九部分:命令速查表
9.1 会话管理速查
| 功能 | 命令 | 快捷键 |
|---|---|---|
| 创建会话 | tmux new -s <name> |
- |
| 查看会话 | tmux ls |
Ctrl+b s |
| 附加会话 | tmux attach -t <name> |
- |
| 分离会话 | tmux detach |
Ctrl+b d |
| 切换会话 | - | Ctrl+b ( / ) |
| 重命名会话 | tmux rename -t <old> <new> |
Ctrl+b $ |
| 销毁会话 | tmux kill-session -t <name> |
- |
| 销毁所有 | tmux kill-server |
- |
9.2 窗口管理速查
| 功能 | 命令 | 快捷键 |
|---|---|---|
| 创建窗口 | tmux new-window |
Ctrl+b c |
| 切换窗口 | - | Ctrl+b 0-9 |
| 下一个窗口 | - | Ctrl+b n |
| 上一个窗口 | - | Ctrl+b p |
| 最近窗口 | - | Ctrl+b l |
| 窗口列表 | - | Ctrl+b w |
| 重命名窗口 | tmux rename-window <name> |
Ctrl+b , |
| 关闭窗口 | tmux kill-window |
Ctrl+b & |
9.3 面板管理速查
| 功能 | 命令 | 快捷键 | 配置优化 |
|---|---|---|---|
| 垂直分割 | tmux split-window -h |
Ctrl+b % |
`Ctrl+b |
| 水平分割 | tmux split-window -v |
Ctrl+b " |
Ctrl+b - |
| 切换面板 | - | Ctrl+b o |
Alt+方向键 |
| 方向切换 | - | Ctrl+b ↑↓←→ |
Ctrl+b hjkl |
| 面板编号 | - | Ctrl+b q |
- |
| 调整大小 | - | Ctrl+b Ctrl+↑↓←→ |
- |
| 切换布局 | - | Ctrl+b Space |
- |
| 关闭面板 | - | Ctrl+b x |
- |
| 面板转窗口 | - | Ctrl+b ! |
- |
9.4 复制模式速查
| 功能 | 快捷键 | Vi 模式 |
|---|---|---|
| 进入复制模式 | Ctrl+b [ |
- |
| 退出复制模式 | q |
q |
| 开始选择 | Space |
v |
| 复制选中 | Enter |
y |
| 粘贴 | Ctrl+b ] |
Ctrl+b p |
| 向上翻页 | PageUp |
Ctrl+b |
| 向下翻页 | PageDown |
Ctrl+f |
| 搜索 | / |
/ |
9.5 深度学习专用速查
| 场景 | 快捷键(需配置) | 说明 |
|---|---|---|
| GPU 监控 | Ctrl+b g |
分屏显示 nvidia-smi |
| 系统监控 | Ctrl+b H |
分屏显示 htop |
| GPU 温度 | Ctrl+b t |
显示 GPU 温度 |
| 监控布局 | Ctrl+b M |
自动创建 4 分屏 |
| 捕获日志 | Ctrl+b Ctrl+l |
保存当前输出 |
9.6 场景化命令卡片
卡片 1:启动训练任务
bash
# 1. 创建会话
tmux new -s training
# 2. 激活环境
conda activate pytorch
# 3. 启动训练
python train.py --epochs 100
# 4. 分离会话
Ctrl+b d
# 5. 稍后重新附加
tmux attach -t training
卡片 2:多实验管理
bash
# 创建项目会话
tmux new -s experiments
# 创建实验窗口
Ctrl+b c # 创建窗口 1
Ctrl+b , # 重命名为 exp-a
Ctrl+b c # 创建窗口 2
Ctrl+b , # 重命名为 exp-b
# 在各窗口启动训练
Ctrl+b 0 # 切换到窗口 0
python train_a.py
Ctrl+b 1 # 切换到窗口 1
python train_b.py
# 创建监控窗口
Ctrl+b c
Ctrl+b % # 左右分屏
# 左侧:watch -n 1 nvidia-smi
# 右侧:tail -f logs/train.log
卡片 3:监控面板
bash
# 创建 4 分屏
Ctrl+b % # 左右分割
Ctrl+b " # 左侧上下分割
Ctrl+b → # 切换到右侧
Ctrl+b " # 右侧上下分割
# 配置各面板
# 左上:tail -f train.log
# 左下:watch -n 1 nvidia-smi
# 右上:htop
# 右下:tensorboard --logdir=./logs
第十部分:扩展学习
10.1 高级主题
1. 自定义插件开发
tmux 插件本质是 shell 脚本,可以扩展 tmux 功能。
示例:自定义 GPU 监控插件
bash
# 创建插件目录
mkdir -p ~/.tmux/plugins/tmux-gpu-monitor
# 创建插件脚本
cat > ~/.tmux/plugins/tmux-gpu-monitor/gpu-monitor.sh << 'EOF'
#!/bin/bash
# GPU 监控插件
get_gpu_usage() {
nvidia-smi --query-gpu=utilization.gpu \
--format=csv,noheader,nounits | \
awk '{print "GPU:"$1"%"}'
}
get_gpu_temp() {
nvidia-smi --query-gpu=temperature.gpu \
--format=csv,noheader,nounits | \
awk '{print "🌡️"$1"°C"}'
}
echo "$(get_gpu_usage) $(get_gpu_temp)"
EOF
chmod +x ~/.tmux/plugins/tmux-gpu-monitor/gpu-monitor.sh
# 在 .tmux.conf 中使用
set -g status-right '#(~/.tmux/plugins/tmux-gpu-monitor/gpu-monitor.sh) | %Y-%m-%d %H:%M'
2. 脚本控制 tmux
示例:Python 控制 tmux
python
# tmux_controller.py
import subprocess
class TmuxController:
def __init__(self, session_name):
self.session = session_name
def create_session(self):
"""创建会话"""
cmd = f"tmux new-session -d -s {self.session}"
subprocess.run(cmd, shell=True)
def send_command(self, window=0, command=""):
"""向窗口发送命令"""
cmd = f"tmux send-keys -t {self.session}:{window} '{command}' C-m"
subprocess.run(cmd, shell=True)
def create_window(self, name):
"""创建窗口"""
cmd = f"tmux new-window -t {self.session} -n {name}"
subprocess.run(cmd, shell=True)
def split_window(self, horizontal=True):
"""分割窗口"""
flag = "-h" if horizontal else "-v"
cmd = f"tmux split-window {flag} -t {self.session}"
subprocess.run(cmd, shell=True)
# 使用示例
if __name__ == "__main__":
# 创建训练环境
tmux = TmuxController("auto-training")
tmux.create_session()
# 窗口 0:训练
tmux.send_command(0, "conda activate pytorch")
tmux.send_command(0, "python train.py")
# 创建监控窗口
tmux.create_window("monitoring")
tmux.send_command(1, "watch -n 1 nvidia-smi")
print("训练环境已创建,使用 'tmux attach -t auto-training' 附加")
3. 复杂布局自动化
示例:保存和恢复自定义布局
bash
#!/bin/bash
# save_layout.sh - 保存当前布局
SESSION="research"
LAYOUT_FILE="$HOME/.tmux/layouts/${SESSION}.layout"
# 保存布局
tmux list-windows -t $SESSION -F \
"#{window_index} #{window_name} #{window_layout}" \
> $LAYOUT_FILE
echo "布局已保存到 $LAYOUT_FILE"
bash
#!/bin/bash
# restore_layout.sh - 恢复布局
SESSION="research"
LAYOUT_FILE="$HOME/.tmux/layouts/${SESSION}.layout"
if [ ! -f "$LAYOUT_FILE" ]; then
echo "布局文件不存在"
exit 1
fi
# 创建会话
tmux new-session -d -s $SESSION
# 恢复布局
while read -r line; do
window_index=$(echo $line | awk '{print $1}')
window_name=$(echo $line | awk '{print $2}')
window_layout=$(echo $line | awk '{print $3}')
tmux new-window -t $SESSION:$window_index -n $window_name
tmux select-layout -t $SESSION:$window_index $window_layout
done < $LAYOUT_FILE
echo "布局已恢复,使用 'tmux attach -t $SESSION' 附加"
10.2 推荐资源
官方文档
- tmux GitHub: https://github.com/tmux/tmux
- tmux Wiki: https://github.com/tmux/tmux/wiki
- Man Page :
man tmux
教程与指南
- tmux Cheat Sheet: https://tmuxcheatsheet.com/
- A Quick and Easy Guide to tmux: https://www.hamvocke.com/blog/a-quick-and-easy-guide-to-tmux/
- The Tao of tmux: https://leanpub.com/the-tao-of-tmux (电子书)
插件生态
- TPM (Tmux Plugin Manager): https://github.com/tmux-plugins/tpm
- Awesome tmux: https://github.com/rothgar/awesome-tmux (插件合集)
配置参考
- tmux-sensible: https://github.com/tmux-plugins/tmux-sensible (合理的默认配置)
- Oh My Tmux: https://github.com/gpakosz/.tmux (美化配置)
视频教程
- tmux Crash Course: YouTube 搜索 "tmux tutorial"
- Learn tmux in 10 Minutes: https://www.youtube.com/watch?v=BHhA_ZKjyxo
10.3 进阶实践项目
项目 1:构建个人深度学习工作台
目标:一键启动完整的深度学习环境
要求:
- 自动创建多窗口布局
- 集成 Jupyter、TensorBoard、监控
- 保存/恢复工作状态
参考脚本:
bash
# 见第七部分的自动化脚本
项目 2:实验管理系统
目标:用 tmux + 脚本管理多个并行实验
功能:
- 实验命名和编号
- 自动记录实验配置
- 监控所有实验状态
- 生成实验报告
技术栈:
- tmux 会话管理
- Python 脚本控制
- 日志自动化
项目 3:团队协作环境
目标:为团队搭建共享研究环境
功能:
- 多人共享会话
- 实验状态看板
- 资源使用监控
- 自动通知系统
10.4 故障排查流程图
遇到 tmux 问题
↓
是否是快捷键不生效?
├─ 是 → 检查前缀键是否正确 → 查看 .tmux.conf
└─ 否 ↓
是否是显示问题?
├─ 是 → 检查 TERM 变量 → 设置 256 色
└─ 否 ↓
是否是会话丢失?
├─ 是 → 检查 tmux ls → 使用 resurrect 恢复
└─ 否 ↓
是否是性能问题?
├─ 是 → 减少历史缓冲 → 降低刷新频率
└─ 否 ↓
查看日志 journalctl -u tmux
↓
Google 搜索错误信息
↓
GitHub Issues 查找
📌 总结与行动清单
核心要点回顾
- tmux 三层结构:Server → Session → Window → Pane
- 断连保护:训练任务在 SSH 断开后继续运行
- 多任务管理:单窗口管理多个实验
- 快捷键系统 :前缀键
Ctrl+b+ 功能键 - 配置优化 :
.tmux.conf自定义工作流
30 分钟快速上手计划
bash
# [0-5 分钟] 安装和验证
sudo apt install tmux
tmux -V
# [5-10 分钟] 基础操作
tmux new -s test
Ctrl+b c # 创建窗口
Ctrl+b % # 分割面板
Ctrl+b d # 分离
tmux attach -t test
# [10-20 分钟] 配置优化
# 复制本教程的 .tmux.conf
vim ~/.tmux.conf
# 粘贴配置内容
tmux source ~/.tmux.conf
# [20-30 分钟] 实战演练
tmux new -s training
conda activate pytorch
python train.py
Ctrl+b d # 分离
# 退出 SSH
# 重新登录
tmux attach -t training # 恢复训练界面
下一步行动
现在就开始:
bash
# 1. 安装 tmux
sudo apt install tmux
# 2. 创建配置文件
vim ~/.tmux.conf
# 复制本教程的配置
# 3. 启动第一个会话
tmux new -s my-first-session
# 4. 开始你的深度学习之旅!