Skip to content

第 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(跨平台现代终端,可选但推荐)

应急通道

  • 不想装 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(客户端 / 服务端)架构

  1. 你在服务器上第一次执行 tmux 时,它在后台启动一个常驻的 tmux 服务端进程。这个服务端不是你 SSH 会话的子进程——它脱离了那条终端的进程树,由 init/systemd 收管,因此 SSH 断开时收不到那条会话的 SIGHUP。
  2. 你看到的 tmux 界面只是一个客户端。你的训练进程实际跑在服务端持有的伪终端里,归属于 tmux 服务端,而非你的 SSH 登录 shell。
  3. "分离(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 会专门展开。

🗺️ 架构重组:会话与进程解耦

❌ 裸 SSH(脆弱链)本地终端SSH 会话(断线即死)Python 训练任务(被杀)✅ tmux 加持(解耦链)本地终端(随意来去)SSH (可随时断开)tmux 守护进程(在服务器上常驻)Python 训练任务(独立运行,不受 SSH 影响)

🚀 拆解实战 A:tmux 核心七招

下面七招覆盖远程长任务的全部日常操作。读之前先记住一个贯穿始终的约定:tmux 的快捷键都要先按前缀键 Ctrl+B(按住 Ctrl 再按 B),松开后再按功能键。本课把这个动作统一写成"Ctrl+B 然后按 X"。之所以要有前缀键,是因为面板里跑着的程序(vim、shell 等)自己也要用各种组合键;前缀键就是告诉 tmux"接下来这一下是发给你的",避免与面板内程序的快捷键打架。

第 1 招:创建命名会话

bash
# SSH 到服务器后
tmux new -s training
# 你已进入一个名为 "training" 的 tmux 会话
# 在里面跑你想跑的命令,比如:
python train.py

第 2 招:分离会话(最关键技能

Ctrl+B松开 Ctrl+B 后再按 D(detach)。 你回到 SSH 主界面。关键:训练任务还在后台运行,但你已脱离 tmux。 此时可以直接关闭 SSH / 关电脑——任务不受影响。

第 3 招:列出/恢复会话

bash
# 第二天重新 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 招:杀死会话

bash
tmux kill-session -t training
# 或者会话内输入 exit

🚀 拆解实战 B:典型科研长任务工作流

bash
# 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 拆解)

上面这套命令不是要背,而是把本课原理一条条落了地。逐步对照看一遍,你就明白每一行在解决哪个痛点:

步骤命令 / 动作对应的原理
2tmux new -s exp01在服务端起一个常驻会话,训练进程从此挂在它下面,而非挂在 SSH 登录 shell 下
3python train.py ... > log.txt 2>&1> log.txt 2>&1 把标准输出与标准错误一并写进日志文件,这样即使没人盯屏,全过程也留痕可查
5watch -n 1 nvidia-smi另一个面板每秒刷新一次 GPU 状态——靠的是"一个服务端开多个伪终端",单条 SSH 连接即可并行监控
7Ctrl+B d(detach)客户端退出、服务端连同训练进程照常运行,这一步之后才能安全断网
9–10重连后 tmux attach -t exp01新客户端接回那个一直没停的服务端,输出历史与 GPU 记录都还在

读懂这张对照表,等于把"七招"和 C/S 架构串成了一条因果链:先把进程托管给常驻服务端 → 多面板边跑边监控 → 安全分离 → 随时接回。

🧪 第二个 Worked Example:批量多组实验(紧扣 Case C 的多模型评测场景)

实战 B 是"单个训练 + 监控"。科研里同样常见的另一种长任务是批量跑多组配置——例如 Case C 要对 300 篇摘要、用三个模型各跑一遍打分,或要把同一实验在多个随机种子上重复以估计稳定性。这类任务一跑就是几小时、且不能中途断,正是 tmux 的另一典型用武之地。下面整套命令仍可直接套用,只把"单条训练"换成"一个批处理脚本 + 一个进度面板"。

bash
# 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-smihtop——"托管给常驻会话 + 日志落盘 + 分屏跟随 + 安全分离"这套骨架完全不变。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 有几个优势:

  1. GPU 加速渲染:滚动巨长日志不卡顿
  2. Lua 配置:所有设置都是代码,可版本管理
  3. 跨平台一致:Windows/Mac/Linux 配置完全相同

最小配置 ~/.wezterm.lua

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,不开 tmuxtmux 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 然后单独按 dCtrl+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/defaulttmux 服务端没在运行——可能服务器重启过(重启会清掉所有 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 进去的服务器上)该服务器没装 tmuxscreen(多数 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 招整理为一页参考卡,加入个人工具箱

🏁 本章小结

把本课凝练成可据以复习的几条要点:

  1. tmux 解决的核心问题:进程与 SSH 会话解耦。SSH 断开会用 SIGHUP 连坐杀掉登录 shell 下的进程;tmux 用 C/S 架构把进程托管到常驻服务端,于是"断网不丢会话"——这是远程长任务的底层保障。
  2. 七招的骨架:创建命名会话(tmux new -s)→ 分离(Ctrl+B d)→ 恢复(tmux attach -t)是占日常 90% 的三招;分屏 / 多窗口 / 滚动历史 / 杀会话是按需扩展。所有快捷键都先按前缀键 Ctrl+B 再按功能键。
  3. 可靠的长任务工作流:进 tmux 跑 → 日志落盘(> log.txt 2>&1)→ 分屏边跑边监控(nvidia-smi / tail -f)→ 安全分离 → 重连恢复 → 结果存盘后回收会话。"早上提交、关机、第二天取结果"靠的是这套流程,不是运气。
  4. WezTerm 与 tmux 分工不同:WezTerm 是终端模拟器(管渲染、配色、GPU 加速、可版本管理的 Lua 配置),tmux 是终端复用器(管会话持久化);二者叠加使用,WezTerm 不替代 tmux 的"断连存活"能力。
  5. 边界要诚实:tmux 扛"网络断"不扛"机器重启"(重启会清空会话,超长任务要叠加 Slurm / nohup);它不渲染、不传文件、开不了图形界面;Windows 须经 WSL2。任务"远端 + 长时 + 怕断连"三条齐了才用 tmux,本地短任务不必。
  6. 出事先分两层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+B d 分离,让进程托管到不随 SSH 生灭的 tmux 服务端,这才能断网继续跑。能点明"扛的是网络断、不是机器关"更佳。

练习 2(工作流补全,紧扣实战 B / Case C)。 你要在服务器上批量跑 Case C 的三模型评测脚本 run_all.sh,预计 6 小时,期间会回宿舍。请写出从 SSH 登录到第二天取结果的完整命令序列,并标出哪一步保证了"断网不丢"、哪一步保证了"事后能定位报错"。

好答案要点:序列应含 ssh 用户名@服务器地址tmux new -s batch_evalbash run_all.sh > batch.log 2>&1> batch.log 2>&1 落盘保证事后能定位是哪个模型 / 种子报错)→ 分屏 tail -f batch.log 跟随 → Ctrl+B d 分离(这一步让会话留在常驻服务端,保证断网不丢)→ 次日 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 以扛重启,即为满分。

助力学者在 AI 时代极速产出高质量学术成果 · 55 课时双轨制 · plan v3.3