第 49 课:tmux、WezTerm 与长任务工作流
🎯 核心实操目标
本课目标:解决"SSH 断线丢进度"与"多窗口并行任务"两大科研痛点。本课你将掌握 tmux 终端复用器的核心操作(创建会话/分屏/挂起/恢复),学会用 WezTerm 替代默认终端,建立"早上提交任务 → 关电脑 → 第二天回来取结果"的可靠长任务工作流。
📋 课前准备(5 分钟自检)
工具/环境(按操作系统)
Linux / Mac
- [ ] tmux 通常已预装:
tmux -V(应返回版本号) - [ ] 未安装时:Mac 用
brew install tmux;Ubuntu 用sudo apt install tmux
Windows
- [ ] tmux 不能原生运行 → 用 WSL2(Windows Subsystem for Linux):learn.microsoft.com/wsl/install
- [ ] 安装 Ubuntu/Debian WSL 发行版后,再装 tmux
WezTerm(跨平台现代终端,可选但推荐)
- [ ] 下载:wezfurlong.org/wezterm/install
- [ ] 内置 GPU 加速、Lua 配置、多 Tab、跨平台一致
应急通道
- 不想装 tmux → 用 screen(Linux/Mac 常预装)作为简化替代
- WSL 安装受网络问题阻挠 → 用云服务器(阿里云/腾讯云 ECS)+ SSH 临时演示
- 实在没有终端环境 → 用 Google Cloud Shell(浏览器内 Linux 终端)
场景导入:SSH 断线毁掉一夜跑出的模型
"你晚上 9 点 SSH 到学校服务器上启动了一个深度学习训练任务,预计跑 8 小时。 你想到学校 23 点要断电,赶紧把笔记本盖上回宿舍。 第二天早上打开电脑,看到的是冷冰冰的
Connection lost。 SSH 一断,你跑了 4 小时的训练全部归零——因为你的 Python 进程是这个 SSH session 的子进程,session 死了进程也死了。"
这种灾难每个理工科学生都至少遇到过一次。tmux 的核心价值就是把进程从 SSH 会话解耦——你可以随意断开/重连而不影响后台任务。
原理:终端复用器为什么能"断连不丢会话"
动手敲命令前,先弄清 tmux 到底解决了什么问题、靠什么机制解决——理解了来由,后面那"七招"你就不必死记,而能自己推断每一招在做什么。
先要厘清那场灾难的根因:进程的"父子绑定"与终端的生命周期。 你 SSH 登录服务器时,远端会为这次连接分配一个伪终端(pseudo-terminal, pty),并启动一个登录 shell 挂在它上面;你在里面敲 python train.py,这个 Python 进程就成了该 shell 的子进程。一旦网络断开或你合上笔记本,SSH 连接中断,远端内核会向这条会话里的进程组发出挂断信号(SIGHUP),登录 shell 收到后退出,挂在它下面的训练进程通常也随之被终止——这就是"跑了 4 小时全部归零"的技术真相:不是训练崩了,是承载它的终端没了,进程被连坐。
tmux(terminal multiplexer,终端复用器)做的事,是在你和训练进程之间插入一个"不会随 SSH 断开而消失"的中间层。 它的关键设计是 C/S(客户端 / 服务端)架构:
- 你在服务器上第一次执行
tmux时,它在后台启动一个常驻的 tmux 服务端进程。这个服务端不是你 SSH 会话的子进程——它脱离了那条终端的进程树,由 init/systemd 收管,因此 SSH 断开时收不到那条会话的 SIGHUP。 - 你看到的 tmux 界面只是一个客户端。你的训练进程实际跑在服务端持有的伪终端里,归属于 tmux 服务端,而非你的 SSH 登录 shell。
- "分离(detach)"做的就是让客户端退出、服务端连同里面的进程照常运行;"恢复(attach)"则是新开一个客户端,重新接回那个一直没停的服务端。
所以断连不丢会话不是魔法:进程的"归属"从一开始就被挂到了一个不随你来去而生灭的常驻进程上。这也顺带解释了 tmux 的另外两项价值——分屏 / 多窗口(一个服务端里可以开多个伪终端,于是单个 SSH 连接就能并行盯着训练、监控、日志)和滚动历史(服务端为每个面板保留了一段输出缓冲,断线重连后历史仍在)。
💡 为什么科研工作者特别需要它
科研任务的典型形态,恰好把 tmux 的价值顶满:① 耗时长——模型训练、大规模仿真、批量数据处理动辄数小时到数天,远超一次 SSH 会话的稳定时长;② 跑在远端——算力多在实验室服务器 / 超算 / 云主机上,必须经 SSH 进入,而宿舍断电、校园网抖动、笔记本休眠都会切断连接;③ 要边跑边盯——训练时要同时看 GPU 占用、看 loss 日志,单窗口来回切换很低效。把这三条对上 tmux 的"解耦 + 多面板 + 历史缓冲",就知道它为什么是远程长任务的标配,而不是可有可无的小技巧。
📘 关键术语(首次出现,先对齐定义)
- 终端复用器(terminal multiplexer):在一个终端连接里复用出多个独立终端会话、并让这些会话在客户端断开后仍持续运行的工具。tmux、GNU Screen 是其代表;"复用"既指空间上的分屏 / 多窗口,也指时间上的会话持久化。
- 会话(session):tmux 里一组窗口与面板的集合,是"持久化"的最小单位。一个会话可含多个窗口(window),每个窗口可再切成多个面板(pane)。分离会话时,整个会话连同里面所有进程都被保留在服务端。
- 分离 / 恢复(detach / attach):detach 让 tmux 客户端退出而服务端会话照常运行(断开 SSH 前的关键动作);attach 让新客户端重新接回某个仍在运行的会话。
- SSH(Secure Shell):在不安全网络上加密地登录并操作远程主机的协议。它负责"连过去",但不负责让你启动的进程在断连后存活——这正是要叠加 tmux 的原因。
- SIGHUP(挂断信号):终端关闭 / 连接中断时,内核向该终端上进程发出的信号,默认行为是终止进程。SSH 断线"连坐"杀掉训练进程,本质就是这个信号在起作用。
- 前缀键(prefix key):tmux 所有快捷键都要先按的"领唱键",默认是
Ctrl+B。按下并松开Ctrl+B后,再按功能键(如d/"/%),tmux 才知道这是发给它的指令、而非发给面板里程序的普通输入。 - 复用器 vs 终端模拟器(multiplexer vs terminal emulator):tmux 是复用器,管会话持久化与分屏,自身不画字、不管字体配色;WezTerm / iTerm2 / Windows Terminal 是终端模拟器,负责把字符渲染成你看到的窗口(字体、配色、GPU 加速)。二者分工不同、可叠加使用——这一点本课实战 C 会专门展开。
🗺️ 架构重组:会话与进程解耦
🚀 拆解实战 A:tmux 核心七招
下面七招覆盖远程长任务的全部日常操作。读之前先记住一个贯穿始终的约定:tmux 的快捷键都要先按前缀键 Ctrl+B(按住 Ctrl 再按 B),松开后再按功能键。本课把这个动作统一写成"Ctrl+B 然后按 X"。之所以要有前缀键,是因为面板里跑着的程序(vim、shell 等)自己也要用各种组合键;前缀键就是告诉 tmux"接下来这一下是发给你的",避免与面板内程序的快捷键打架。
第 1 招:创建命名会话
# SSH 到服务器后
tmux new -s training
# 你已进入一个名为 "training" 的 tmux 会话
# 在里面跑你想跑的命令,比如:
python train.py第 2 招:分离会话(最关键技能)
按 Ctrl+B,松开 Ctrl+B 后再按 D(detach)。 你回到 SSH 主界面。关键:训练任务还在后台运行,但你已脱离 tmux。 此时可以直接关闭 SSH / 关电脑——任务不受影响。
第 3 招:列出/恢复会话
# 第二天重新 SSH 到服务器后
tmux ls
# 输出: training: 1 windows (created Tue Aug 15 21:00:00)
tmux attach -t training
# 重新进入 training 会话,看到训练任务的输出第 4 招:分屏(多任务并行)
在 tmux 会话内:
Ctrl+B然后按"—— 分成上下两个面板Ctrl+B然后按%—— 分成左右两个面板Ctrl+B然后按方向键 —— 切换面板焦点
典型用法:一个面板跑训练,一个面板看 GPU 占用(nvidia-smi),一个面板看日志(tail -f log.txt)。
第 5 招:多窗口
Ctrl+B 然后按 C —— 新建一个 tmux 窗口 Ctrl+B 然后按 数字键 0/1/2... —— 切换到对应编号的窗口 Ctrl+B 然后按 , —— 给当前窗口改名
第 6 招:滚动查看历史
Ctrl+B 然后按 [ —— 进入复制模式,方向键可以向上翻历史输出 按 q 退出复制模式
第 7 招:杀死会话
tmux kill-session -t training
# 或者会话内输入 exit🚀 拆解实战 B:典型科研长任务工作流
# 1. SSH 到服务器
ssh 用户名@服务器地址
# 2. 创建 tmux 会话
tmux new -s exp01
# 3. 分屏: 上面板放训练
python train.py --epochs 50 --lr 0.001 > log.txt 2>&1
# 4. 按 Ctrl+B 然后 " 切到下面板
# 5. 下面板放 GPU 监控
watch -n 1 nvidia-smi
# 6. Ctrl+B + 上下方向键切回训练面板
# 7. 按 Ctrl+B + D 脱离会话
# 8. 关闭笔记本,去睡觉
# === 第二天 ===
# 9. SSH 重连
ssh 用户名@服务器地址
# 10. 恢复会话
tmux attach -t exp01
# 看到训练完成的全部输出和 GPU 占用历史📐 把这套流程逐行对回原理(Worked Example 拆解)
上面这套命令不是要背,而是把本课原理一条条落了地。逐步对照看一遍,你就明白每一行在解决哪个痛点:
| 步骤 | 命令 / 动作 | 对应的原理 |
|---|---|---|
| 2 | tmux new -s exp01 | 在服务端起一个常驻会话,训练进程从此挂在它下面,而非挂在 SSH 登录 shell 下 |
| 3 | python train.py ... > log.txt 2>&1 | > log.txt 2>&1 把标准输出与标准错误一并写进日志文件,这样即使没人盯屏,全过程也留痕可查 |
| 5 | watch -n 1 nvidia-smi | 另一个面板每秒刷新一次 GPU 状态——靠的是"一个服务端开多个伪终端",单条 SSH 连接即可并行监控 |
| 7 | Ctrl+B d(detach) | 客户端退出、服务端连同训练进程照常运行,这一步之后才能安全断网 |
| 9–10 | 重连后 tmux attach -t exp01 | 新客户端接回那个一直没停的服务端,输出历史与 GPU 记录都还在 |
读懂这张对照表,等于把"七招"和 C/S 架构串成了一条因果链:先把进程托管给常驻服务端 → 多面板边跑边监控 → 安全分离 → 随时接回。
🧪 第二个 Worked Example:批量多组实验(紧扣 Case C 的多模型评测场景)
实战 B 是"单个训练 + 监控"。科研里同样常见的另一种长任务是批量跑多组配置——例如 Case C 要对 300 篇摘要、用三个模型各跑一遍打分,或要把同一实验在多个随机种子上重复以估计稳定性。这类任务一跑就是几小时、且不能中途断,正是 tmux 的另一典型用武之地。下面整套命令仍可直接套用,只把"单条训练"换成"一个批处理脚本 + 一个进度面板"。
# 1. SSH 到服务器
ssh 用户名@服务器地址
# 2. 新建会话(用实验名命名,便于日后 tmux ls 时一眼认出)
tmux new -s batch_eval
# 3. 主面板:跑批处理脚本,把全过程日志落盘
# run_all.sh 内部循环三个模型 / 多个随机种子,逐条调用评测
bash run_all.sh > batch.log 2>&1
# 4. Ctrl+B 然后 " :上下分屏,切到下面板
# 5. 下面板:实时跟随日志,随时看进度与报错
tail -f batch.log
# 6. (可选)Ctrl+B 然后 " 再分一个面板看资源占用
watch -n 5 nvidia-smi # 没有 GPU 时可换成 htop 看 CPU/内存
# 7. Ctrl+B 然后 d :分离,断网回家
# === 数小时后 ===
# 8. 重连并恢复
ssh 用户名@服务器地址
tmux attach -t batch_eval
# 看到 batch.log 已滚到末尾,三个模型 / 各随机种子的评测全部跑完迁移要点:会话名换成你的实验代号、run_all.sh 换成你学科的批处理脚本、监控面板按有无 GPU 选 nvidia-smi 或 htop——"托管给常驻会话 + 日志落盘 + 分屏跟随 + 安全分离"这套骨架完全不变。Case C 这类"多模型 / 多种子重复实验"尤其要把日志落盘(> batch.log 2>&1)做实,因为一旦哪一组中途报错,事后要靠日志定位是哪个模型 / 哪个种子出的问题。
🚀 拆解实战 C:WezTerm 配置(可选升级)
⚠️ 先分清:WezTerm 是终端模拟器,不是 tmux 的替代品
新手最容易把这两件事混为一谈。WezTerm 是终端模拟器(terminal emulator)——它负责"画窗口":字体、配色、GPU 加速渲染、本地 Tab;tmux 是终端复用器——它负责"会话持久化",让远端进程在 SSH 断开后存活。前面那个"断电也不丢训练"的核心能力来自 服务器上的 tmux,换成 WezTerm 并不能替代它。本节配 WezTerm,是为了把本地这一端的终端体验做好(看长日志不卡、配置可版本管理),它和服务器上的 tmux 是叠加关系:本地开 WezTerm,SSH 进服务器后照样在里面用 tmux。
(补充一句以免误导:WezTerm 自身也带一套多路复用 / 远程域 mux 功能,能做类似分屏与会话保持,但那是另一套机制、需要单独配置;在"远程服务器跑长任务"这一最常见场景里,服务器侧的 tmux 仍是更通用、更省心的选择。)
WezTerm 是现代终端模拟器的代表,相比 Windows Terminal / iTerm2 有几个优势:
- GPU 加速渲染:滚动巨长日志不卡顿
- Lua 配置:所有设置都是代码,可版本管理
- 跨平台一致:Windows/Mac/Linux 配置完全相同
最小配置 ~/.wezterm.lua:
local wezterm = require 'wezterm'
return {
-- 字体
font = wezterm.font('JetBrains Mono'),
font_size = 14.0,
-- 颜色主题
color_scheme = 'Tokyo Night',
-- 默认窗口大小
initial_cols = 120,
initial_rows = 40,
-- 显示 WezTerm 自带的标签栏(本地多 Tab 用,与服务器上的 tmux 状态栏各自独立)
enable_tab_bar = true,
-- 鼠标选中即复制
selection_word_boundary = ' \t\n{[}]()\"\'`',
}小贴士:看超长日志可加一行
scrollback_lines = 10000,。 WezTerm 默认保留 3500 行回滚历史;跑大任务时日志动辄上万行,把它调大能让你向上翻得更远(代价是多占一点内存)。这正体现了"配置即代码"的好处——所有偏好都写在这份可版本管理的 Lua 里。
写好 vs 写砸:长任务工作流的逐项对照
同样是"在服务器上跑一夜训练",习惯不同,结局可能是"第二天回来取结果",也可能是"第二天回来收尸"。下表把最常见的失分点逐项拆开并排——左列是新手高频做法,右列是把同一处"拧紧"后的做法。
| 维度 | 写砸 ❌ | 写好 ✅ | 为什么 |
|---|---|---|---|
| 进程托管 | 直接 ssh 进去就 python train.py,不开 tmux | 先 tmux new -s exp01 再跑 | 不进 tmux,SSH 一断进程被 SIGHUP 连坐杀掉,前功尽弃 |
| 断开方式 | 直接关笔记本 / 叉掉终端窗口 | 先 Ctrl+B d 分离,再断网 | 没分离就硬断,行为不可控;规范做法是先 detach 让会话留在服务端 |
| 会话命名 | tmux new(匿名,编号 0/1/2) | tmux new -s exp01(按实验命名) | 匿名会话多了根本分不清谁是谁;命名后 tmux ls 一眼认出 |
| 日志 | 只让输出滚在屏幕上,不落盘 | python train.py ... > log.txt 2>&1 | 屏幕缓冲有限、断了就没;落盘后全过程可查、报错可追 |
| 监控 | 跑完才去看结果对不对 | 分屏挂 watch -n 1 nvidia-smi + tail -f log.txt | 边跑边盯能尽早发现 loss 跑飞 / 显存爆 / 报错,省下整夜白跑 |
| 会话回收 | 跑完不管,会话一直挂着 | 确认结果已存盘后 tmux kill-session -t exp01 | 僵尸会话长期占服务器资源;多人共用的机器尤其要收尾 |
| 本地终端 | 用默认终端看万行日志卡成幻灯片 | 用 WezTerm(GPU 加速 + 大 scrollback) | 渲染流畅、能往回翻更多历史,排查体验天差地别 |
💡 一句话判据
检验一套长任务工作流靠不靠谱,问四件事:进程进 tmux 了吗?断开前 detach 了吗?日志落盘了吗?跑完会话回收了吗? 四项都做到,"早上提交任务 → 关电脑 → 第二天取结果"才真正可靠,而不是碰运气。
常见误区与纠正
学员上手 tmux 时踩的坑高度集中在几处,下表对号入座即可:
| 常见误区 | 症状 | 纠正方法 |
|---|---|---|
| 不开 tmux 就跑长任务 | SSH 一断,跑了几小时的任务全没了 | 任何预计超过几分钟、又怕断连的远程任务,先 tmux new -s 名字 再跑 |
想 detach 却按成 Ctrl+D | 误发 EOF,shell 退出,会话被关 | detach 是 Ctrl+B 然后单独按 d;Ctrl+D 是给 shell 发结束符,二者完全不同 |
| 前缀键和功能键一起按 | Ctrl+B+D 同时按下,无反应或行为怪异 | 先按 Ctrl+B 并松开,再按功能键;前缀键是"先敲门再说话" |
| 会话全匿名 | tmux ls 出来一堆 0: / 1: /2:,认不出哪个是哪个 | 一律用 -s 实验名 命名;忘了可 Ctrl+B , 给窗口改名 |
| Windows 上找不到 tmux | 在 PowerShell / CMD 里敲 tmux 报"不是内部或外部命令" | tmux 不能原生跑在 Windows;须进 WSL2 的 Linux 发行版里用(见课前准备) |
| 复制模式滚完退不出来 | 进了 Ctrl+B [ 后方向键不再控制命令行 | 这是复制模式,按 q 退出即可恢复正常输入 |
| attach 报 "no sessions" | 重连后 tmux attach 提示没有会话 | 多半是连错了服务器,或会话确实已结束;先 tmux ls 确认还在不在 |
报错与排查:重连时最常撞上的几条
远程长任务出问题,往往不在"跑"的时候,而在"重连去取结果"的时候。下面把最常遇到的报错原文与对策列出,照着对号入座即可。
| 报错 / 现象 | 原因 | 处理 |
|---|---|---|
no server running on /tmp/tmux-1000/default | tmux 服务端没在运行——可能服务器重启过(重启会清掉所有 tmux 会话),或你从没在这台机器上开过会话 | 会话已随重启消失,无法找回;重新 tmux new 起任务。重要任务应配合日志落盘,重启后至少日志还在 |
can't find session: exp01 | 会话名打错,或该会话已被 kill / 已结束 | 先 tmux ls 看真实存在的会话名,再 tmux attach -t 正确的名字 |
sessions should be nested with care, unset $TMUX to force | 你已经在一个 tmux 会话里,又敲了 tmux attach(嵌套了) | 当前已在 tmux 中,无需再 attach;要嵌套则先 tmux detach 回到外层,或在新终端里连 |
| 重连后日志停在几小时前不动了 | 训练进程可能早已崩溃 / 被 OOM Killer 杀掉,但 tmux 面板还停留在崩溃前的画面 | 在该面板回车看是否已回到 shell 提示符;查 log.txt 末尾的报错;必要时 dmesg | tail 看是否被系统因内存不足杀掉 |
tmux attach 后界面错位 / 花屏 | 新终端与原会话的窗口尺寸不一致 | Ctrl+B d 分离再重新 attach,或 Ctrl+B 然后按 r 强制重绘 |
tmux: command not found(在 SSH 进去的服务器上) | 该服务器没装 tmux | 用 screen(多数 Linux 预装)顶上:screen -S exp01 起会话、Ctrl+A d 分离、screen -r exp01 恢复 |
🔧 排查心法
远程长任务"出事"时,先分清是会话没了还是进程没了:tmux ls 能列出会话,说明 tmux 这一层好的,问题在里面的进程(去看日志末尾的报错);tmux ls 说 no server,才是会话层整个没了(多半服务器重启)。把这两层分开看,排查方向立刻清晰——这也是为什么前面反复强调日志一定要落盘:会话可以重建,跑过的过程只有日志能留住。
边界与局限:tmux 能解决什么、不能解决什么,以及何时不需要
tmux 是远程长任务的利器,但它不是万能的,也不是每个场景都该上。把下面几条边界记牢,比多背一个快捷键更重要。
| 边界 / 失效场景 | 为什么会这样 | 你应该怎么做 |
|---|---|---|
| 服务器重启,会话照样没 | tmux 会话活在内存里的服务端进程中,断电 / 重启会清空——它扛的是"网络断",不是"机器关" | 真正怕重启的超长任务,叠加用作业调度(如 Slurm 的 sbatch)或 nohup + 落盘,把任务交给系统级机制 |
| 学习成本:快捷键要练 | 前缀键 + 一堆组合键有记忆负担,初期容易误操作 | 先练熟"创建 / 分离 / 恢复"三招(占日常 90%),分屏多窗口用熟了再扩;做一张速查卡放手边 |
| 本机短任务上 tmux 是过度设计 | 在自己电脑上跑几十秒就完的脚本,根本不存在"断连丢进程"问题 | 短任务 / 本地任务直接跑即可;tmux 的价值集中在远程 + 长时这一交集 |
| tmux 不渲染、不传文件 | 它只管会话与分屏,不负责字体配色(那是终端模拟器的事),也不负责传输文件 | 体验交给 WezTerm 等终端模拟器;传文件用 scp / rsync,别指望 tmux |
| GUI / 图形界面救不了 | tmux 是纯字符终端复用器,开不了图形窗口 | 需要远程图形界面用 VNC / X11 转发 / 远程桌面,那是另一条技术路线 |
| Windows 不能原生用 | tmux 依赖类 Unix 的进程与信号模型 | Windows 用户经 WSL2 进 Linux 环境用;或直接在 Linux 服务器侧用,本地只负责 SSH 过去 |
🧭 何时该用、何时不必
一句话划线:任务"跑在远端 + 耗时长 + 怕断连",三条同时成立,就用 tmux;缺其中任意一条,往往不必。 本地两分钟的脚本、跑完即走的一次性命令,硬套 tmux 只是增加心智负担。把工具用在它真正解决问题的地方,才是熟练的标志。
📦 本课交付物
按本节实操任务完成并提交以下内容,提交 AI 初审,按 Module_Rubrics.md 对应维度评分:
- [ ] tmux 会话演练截图:完成一次"创建会话 → 运行任务 → 分离 → 重连"的完整流程,截 4 张关键时刻
- [ ] 分屏多任务截图:tmux 内分屏跑 Python 训练 + nvidia-smi 监控 + tail 日志
- [ ] WezTerm 配置文件(可选):自己的
.wezterm.lua配置,含字体、主题、窗口大小至少 3 项定制 - [ ] 个人 tmux 速查卡:把本课 7 招整理为一页参考卡,加入个人工具箱
🏁 本章小结
把本课凝练成可据以复习的几条要点:
- tmux 解决的核心问题:进程与 SSH 会话解耦。SSH 断开会用 SIGHUP 连坐杀掉登录 shell 下的进程;tmux 用 C/S 架构把进程托管到常驻服务端,于是"断网不丢会话"——这是远程长任务的底层保障。
- 七招的骨架:创建命名会话(
tmux new -s)→ 分离(Ctrl+Bd)→ 恢复(tmux attach -t)是占日常 90% 的三招;分屏 / 多窗口 / 滚动历史 / 杀会话是按需扩展。所有快捷键都先按前缀键Ctrl+B再按功能键。 - 可靠的长任务工作流:进 tmux 跑 → 日志落盘(
> log.txt 2>&1)→ 分屏边跑边监控(nvidia-smi/tail -f)→ 安全分离 → 重连恢复 → 结果存盘后回收会话。"早上提交、关机、第二天取结果"靠的是这套流程,不是运气。 - WezTerm 与 tmux 分工不同:WezTerm 是终端模拟器(管渲染、配色、GPU 加速、可版本管理的 Lua 配置),tmux 是终端复用器(管会话持久化);二者叠加使用,WezTerm 不替代 tmux 的"断连存活"能力。
- 边界要诚实:tmux 扛"网络断"不扛"机器重启"(重启会清空会话,超长任务要叠加 Slurm /
nohup);它不渲染、不传文件、开不了图形界面;Windows 须经 WSL2。任务"远端 + 长时 + 怕断连"三条齐了才用 tmux,本地短任务不必。 - 出事先分两层:
tmux ls列得出会话 = 会话层好的,问题在里面的进程(查日志末尾报错);no server= 会话层整个没了(多半重启)。会话可重建,过程只有落盘的日志能留住。
自测清单(可保留逐项打勾)
- [ ] 我能讲清 tmux 解决的核心问题:进程与 SSH 会话解耦,断线不丢任务,并说出"SIGHUP 连坐 + 常驻服务端"这条机制。
- [ ] 我掌握了 tmux 七招:创建 / 分离 / 恢复 / 分屏 / 多窗口 / 滚动 / 杀会话,且知道快捷键要先按前缀键
Ctrl+B。 - [ ] 我能用 tmux 搭建"分屏跑训练 + 监控 GPU + 看日志"的多面板工作流,并把全过程日志落盘。
- [ ] 我清楚 Windows 用户的限制:必须通过 WSL2 才能用 tmux。
- [ ] 我了解 WezTerm 是终端模拟器、与 tmux 分工不同,能写出含字体 / 主题 / 窗口大小的基础 Lua 配置。
- [ ] 我会用
tmux ls检查是否有遗忘的会话,避免长期占用服务器资源;也知道服务器重启会清空会话、超长任务需另叠加机制。
✍️ 思考与练习
下列练习用于把本节概念用起来(区别于"本课交付物"里的任务),建议写在你的本地笔记中。涉及服务器地址、用户名一律用占位(如 用户名@服务器地址),不要把真实凭据写进笔记。
练习 1(机制辨析)。 同学甲说:"我直接 ssh 进服务器跑 python train.py,然后把笔记本合上回宿舍,任务应该会一直跑吧?"请用本课原理说明这个判断为什么靠不住,以及正确做法是什么。
好答案要点:合上笔记本 / 网络中断会断开 SSH,远端内核向该会话进程组发 SIGHUP,登录 shell 退出,挂在它下面的训练进程作为子进程被一并终止——任务并不会自己活下来。正确做法是先
tmux new -s exp01起一个常驻会话再跑,跑起来后Ctrl+Bd分离,让进程托管到不随 SSH 生灭的 tmux 服务端,这才能断网继续跑。能点明"扛的是网络断、不是机器关"更佳。
练习 2(工作流补全,紧扣实战 B / Case C)。 你要在服务器上批量跑 Case C 的三模型评测脚本 run_all.sh,预计 6 小时,期间会回宿舍。请写出从 SSH 登录到第二天取结果的完整命令序列,并标出哪一步保证了"断网不丢"、哪一步保证了"事后能定位报错"。
好答案要点:序列应含
ssh 用户名@服务器地址→tmux new -s batch_eval→bash run_all.sh > batch.log 2>&1(> batch.log 2>&1落盘保证事后能定位是哪个模型 / 种子报错)→ 分屏tail -f batch.log跟随 →Ctrl+Bd分离(这一步让会话留在常驻服务端,保证断网不丢)→ 次日ssh ...重连 →tmux attach -t batch_eval取结果 → 确认存盘后tmux kill-session -t batch_eval回收。能说清两处关键步骤的作用即达标。
练习 3(概念区分)。 有人说"装了 WezTerm 就不用 tmux 了,反正都能分屏"。请指出这句话错在哪,并说清在"远程服务器跑一夜训练"这个场景里,到底是谁在保证"断电不丢"。
好答案要点:WezTerm 是终端模拟器(本地这一端,管渲染 / 配色 / GPU 加速 / 本地 Tab),tmux 是终端复用器(管会话持久化);"分屏"两者表面都能做,但"远程进程在 SSH 断开后存活"靠的是服务器上运行的 tmux 服务端,本地的 WezTerm 替代不了它。二者是叠加关系:本地开 WezTerm、SSH 进服务器后照样用 tmux。能补一句"WezTerm 自带的 mux 是另一套机制、需单独配置,常见远程场景仍用服务器侧 tmux"更佳。
练习 4(排查定位)。 你重连服务器后 tmux attach -t exp01,报 can't find session: exp01;换个名字试又报 no server running...。请按本课"分两层"的排查心法,判断最可能发生了什么、下一步怎么做。
好答案要点:
no server running说明会话层整个没了——不是名字打错,而是 tmux 服务端已不在,最可能是服务器重启过(重启会清空所有 tmux 会话),会话与其中进程都无法找回。下一步:重新tmux new起任务;若此前有> log.txt 2>&1落盘,至少能从日志看到上次跑到哪、为何中断。能点出"会话可重建、过程靠日志留存",并说明今后超长任务应叠加 Slurm /nohup以扛重启,即为满分。
