深度学习中的 tmux

深度学习中的 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(会话)
  • 定义:独立的工作环境,包含一组窗口

  • 类比:项目或任务的工作空间

  • 命名建议

    bash 复制代码
    deep-learning    # 深度学习总项目
    resnet-training  # ResNet 训练实验
    data-processing  # 数据预处理
3️⃣ Window(窗口)
  • 定义:会话内的独立"标签页"

  • 类比:浏览器中的不同标签

  • 典型用途

    bash 复制代码
    Window 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 推荐资源

官方文档
教程与指南
插件生态
配置参考
视频教程

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 查找

📌 总结与行动清单

核心要点回顾

  1. tmux 三层结构:Server → Session → Window → Pane
  2. 断连保护:训练任务在 SSH 断开后继续运行
  3. 多任务管理:单窗口管理多个实验
  4. 快捷键系统 :前缀键 Ctrl+b + 功能键
  5. 配置优化.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. 开始你的深度学习之旅!

相关推荐
<-->2 小时前
deepspeed vs vllm
人工智能
Sinokap2 小时前
Perplexity 10 月更新:AI 搜索体验再升级,让信息更近一步
人工智能·perplexity
檐下翻书1732 小时前
PC端免费跨职能流程图模板大全 中文
大数据·人工智能·架构·流程图·论文笔记
LaughingZhu2 小时前
Product Hunt 每日热榜 | 2026-01-12
人工智能·经验分享·深度学习·神经网络·产品运营
美团技术团队2 小时前
AAAI 2026 | 美团技术团队学术论文精选
人工智能
不如自挂东南吱2 小时前
空间相关性 和 怎么捕捉空间相关性
人工智能·深度学习·算法·机器学习·时序数据库
xiaozhazha_2 小时前
2026 新规落地,金融级远程会议软件选型:快鹭会议AI 与合规技术双驱动
人工智能·金融
小鸡吃米…3 小时前
机器学习中的简单线性回归
人工智能·机器学习·线性回归
AOwhisky3 小时前
Linux防火墙管理指南
linux·运维·服务器