tmux 终端使用

在 AutoDL 等云服务器上跑实验时,最崩溃的莫过于本地网络突然闪断,导致跑了一半的脚本直接被终止。tmux (Terminal Multiplexer) 就是为了解决这个问题而生的。它可以让你的任务在后台持续运行,随时随地重新连接查看进度。

核心概念:为什么需要 tmux?

当你通过 SSH 或 Jupyter 终端连接到 AutoDL 时,你启动的进程是依附于当前终端会话的。终端一关,进程就死。
tmux 可以在服务器端创建一个持久化的虚拟终端。即使你的电脑关机、断网,tmux 里的实验依然在服务器上稳稳地跑着。

安装 tmux

在 AutoDL 服务器里运行:

1
2
3
apt update
apt install -y tmux
tmux -V

看到类似:

1
tmux 3.2a

就说明安装成功。

🚀 极简工作流 (只需记住这 4 条命令)

日常使用只需掌握以下四步,就能应付 99% 的场景:

1. 新建并进入会话 (Session)

强烈建议给会话起个有意义的名字,方便后续区分不同的实验。

1
tmux new -s dolos_exp

此时你已经进入了 tmux 的虚拟终端,可以像平时一样激活环境、运行特征提取或模型训练的脚本了。比如直接在这里执行你的 OpenFace 相关指令。

解释:

1
2
new = 新建会话
-s dolos_exp = 会话名字叫 dolos_exp

进入 tmux 后,就像普通终端一样运行命令:

2. 离开会话 (Detach) - 让程序在后台跑

当你的代码开始运行后,你想关掉电脑去干别的,只需按下快捷键:
先按 Ctrl + b (松开),然后按 d (detach)。
此时你会退回到原来的真实终端,提示 [detached],但 tmux 里的任务仍在后台满载运行。

在 tmux 里面按:

1
Ctrl + B

松开,然后按:

1
D

这叫 detach,意思是“退出会话但不关闭程序”。你会回到普通终端,实验仍然在后台继续跑。

3. 查看后台有哪些会话

当你重新连上 AutoDL 时,想看看有哪些任务在跑:

1
tmux ls

4. 重新连回会话 (Attach) - 查看进度

找到你想看的会话名字(例如 dolos_exp),将其恢复到前台:

1
2
3
tmux attach -t dolos_exp
#简写
tmux a -t dolos_exp

⌨️ 进阶快捷键:多窗口与滚动查看日志

tmux 中,所有的快捷键操作都需要先按一个**前缀键 (Prefix)**,默认是 **Ctrl + b**。

1. 查看历史输出(极其重要!)

tmux 里,默认情况下你无法直接用鼠标滚轮向上翻看历史运行日志。

  1. 进入滚动模式:按 Ctrl + b,松开后按 [
  2. 现在你可以用键盘的上下方向键,或者 Page Up / Page Down 来自由翻看历史输出了。
  3. 退出滚动模式:按 qEsc

2. 屏幕分屏 (Panes)

想在一块屏幕上边看 GPU 占用率(watch -n 1 nvidia-smi),边看代码日志输出?

  • 左右分屏Ctrl + b,松开后按 %
  • 上下分屏Ctrl + b,松开后按 "
  • 在分屏间切换光标Ctrl + b,松开后按方向键 ↑ ↓ ← →
  • 关闭当前光标所在的分屏:直接输入 exit 或按 Ctrl + d

🗑️ 清理与退出

在 tmux 里,想停止当前实验:

1
Ctrl + C

如果想关闭整个 tmux 会话:

1
exit

如果你在真实的终端里,想直接杀掉名为 dolos_exp 的后台会话:

1
tmux kill-session -t dolos_exp

实战小贴士:AutoDL 官方镜像默认已预装 tmux。无论是通过本地 SSH 工具(如 Xshell、Termius)还是网页版的 JupyterLab Terminal,都可以直接零配置无缝使用。

杀掉所有 tmux 会话:

1
tmux kill-server

慎用,会把所有 tmux 里的任务都停掉。

开启“全能鼠标模式” (支持滚轮翻页)

开启鼠标模式后,你可以直接用鼠标滚轮上下滚动查看历史输出,也可以直接鼠标点击切换分屏、拖拽调整分屏大小。

临时开启(当前会话生效)

  1. tmux 会话中,按下前缀键 **Ctrl + b**,松开。
  2. 按下 : (进入命令行模式,底部会变黄或出现提示符)。
  3. 输入 set -g mouse on,然后回车。
    现在你就可以直接滚动鼠标滚轮来翻看上方的日志了(滚动时会自动进入查看模式,按 q 退出回到最新输出)。

永久开启(推荐,一劳永逸)

为了让你以后每次进 tmux 都不用重新敲命令,把它写进配置文件里:

先创建配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cat > ~/.tmux.conf <<'EOF'
# 开启鼠标支持:鼠标滚轮、点击切换 pane、拖动选择
set -g mouse on

# 增大历史滚动行数
set -g history-limit 100000

# 使用 vi 风格复制模式
setw -g mode-keys vi

# 让状态栏更清楚
set -g status on
set -g status-left "[#S] "
set -g status-right "%Y-%m-%d %H:%M"

# 解决部分终端颜色问题
set -g default-terminal "screen-256color"
EOF

让配置生效:

1
tmux source-file ~/.tmux.conf

如果运行失败上面的tmux source-file ~/.tmux.conf代码,出现下面报错,
error connecting to /tmp/tmux-0/default (No such file or directory)

的原因非常简单:

因为你当前根本没有在 tmux 会话(Session)里面。

tmux source-file 命令的作用是让当前正在运行的 tmux 实例重新加载配置文件。如果你直接在普通的终端(比如 AutoDL 的标准 JupyterLab 终端或普通 SSH 窗口)里运行它,它找不到正在运行的 tmux 服务,就会报这个错。

不过别担心,你的配置文件其实已经成功写入了!

如果还没进入 tmux,也没关系,下一次打开 tmux 会自动生效。

📋复制与粘贴的终极奥义

tmux 中复制粘贴有两个完全不同的场景,最核心的秘诀在于 Shift

场景一:把 AutoDL 里的代码/报错,复制到你自己的电脑上(最常用)

痛点:开启了 mouse on 之后,你会发现直接用鼠标选中文本,一旦松手选择就消失了,根本没法 Ctrl+C 复制到本地。
解决方案按住 Shift 键!

  1. 复制:按住键盘上的 Shift 键不放,然后用鼠标去选中文本。此时系统会绕过 tmux 的拦截,调用你本地终端的原始选中功能。选中后,直接使用本地的复制快捷键(Win: Ctrl+Insert 或 右键复制,Mac: Cmd+C)。
  2. 粘贴:想把本地代码粘贴到 tmux 里,同样按住 Shift 键,然后点击鼠标右键进行粘贴(或者 Shift+Insert / Cmd+V)。

场景二:在 tmux 的不同分屏内部互相复制粘贴 (纯键盘流)

如果你只是想把左边分屏的一段路径,复制到右边分屏,不需要经过本地电脑的剪贴板,可以使用 tmux 内置的复制模式:

  1. 进入复制模式:按 Ctrl + b,松开后按 [ (右上角会出现行号指示器)。
  2. 移动光标:用方向键移动到你要复制的开头位置。
  3. 开始选择:按下 **空格键 (Space)**,然后用方向键移动光标,选中你需要的文本(文本会高亮)。
  4. 确认复制:按下 **回车键 (Enter)**。高亮消失,文本已经保存在 tmux 的内部剪贴板了,同时自动退出了复制模式。
  5. 粘贴:切换到你想粘贴的地方,按 Ctrl + b,松开后按 **]**,内容就粘贴出来了。

总结:开启 set -g mouse on 获得滚轮自由,配合 Shift 键实现本地与服务器的无缝复制粘贴,这两个技巧能解决 tmux 90% 的使用痛点。