使用 tmux 让服务器程序持续运行
Made by Mike_Zhang
Unfold Linux Topics | 展开Linux主题 $\triangledown$
程序可以慢慢跑,但 SSH 不一定能一直连着。
NO BULLSHIT
30秒开门见山版
如果你只想解决一个问题:
我在服务器 Terminal 里运行了一个很久的程序,希望它不会因为 SSH 断开、电脑休眠、Terminal 关闭而中断。
那么可以先记住下面这组命令:
1 | |
简单来说:
tmux可以让程序在服务器上继续运行,即使你的 SSH 连接断了;tmux里的核心单位是 session,你可以 detach 离开,也可以 attach 回来;- 一个 session 里面可以有多个 window,一个 window 里面可以分成多个 pane;
- 对服务器训练模型、下载数据、跑脚本、编译程序、看日志、监控 GPU 来说,
tmux非常实用; tmux不是任务调度系统。服务器重启、程序自己报错退出、被管理员杀掉,tmux救不了。
Intro
导言
在服务器上跑程序时,我们常常会遇到一个很现实的问题:
1 | |
程序开始跑了,GPU 也用上了,看起来一切都很好。
然后可能发生下面这些事情:
- Wi-Fi 抖了一下,SSH 断了;
- 电脑合盖睡眠,连接断了;
- Terminal 被不小心关掉了;
- 想回宿舍继续看同一个程序的输出,但当时开的 Terminal 已经没了;
- 一个 Terminal 里既想跑程序,又想看日志,还想监控 GPU,占了好几个 SSH 窗口,很乱。
如果程序正好是前台运行的普通命令,那么外面的 SSH 连接断掉后,程序很可能也跟着结束。即使某些程序在特定情况下没有立刻死掉,也不应该把它当成可靠的工作流。
所以我们需要一个工具,让服务器上的工作空间和本地 SSH 连接解耦。
这就是tmux最直接的价值。
1. What is tmux
1. tmux是什么
tmux的全称可以理解为 terminal multiplexer,也就是“终端复用器”。
官方文档里的核心意思是:tmux运行在一个 terminal 里,但它可以在里面管理多个 terminal 程序;这些程序可以从当前 terminal detach 出去,然后之后再从同一台或另一台电脑 reattach 回来。
我自己的理解是:
tmux像是服务器上的一个可恢复工作台。SSH 只是你临时走进这个工作台的一扇门,门关了,工作台还在。
tmux里有几个基础概念:
| Concept | 中文理解 | 用来做什么 |
|---|---|---|
session |
一组工作空间 | 例如一个项目、一次训练、一个实验 |
window |
session 里的标签页 | 一个 window 跑训练,一个 window 看日志 |
pane |
window 里的分屏 | 左边跑程序,右边看 GPU,下面看 log |
prefix |
tmux 快捷键前缀 | 默认是Ctrl-b,先按它再按其他键 |
最重要的是:你的程序运行在 tmux session 里,而不是直接绑死在 SSH 这个连接上。
本文的终端示例使用 Markdown 代码块,并用bash或text标记命令和输出。这样更方便复制、搜索,也更接近真实命令行文本。
2. Installation
2. 安装
如果服务器已经装好了tmux,可以直接检查版本:
1 | |
常见系统的安装方式如下:
1 | |
注意:如果你是在远程服务器上跑程序,应该把tmux安装在服务器上。
在自己电脑本地装tmux当然也有用,但它不能保护远程服务器上没有进入 tmux 的程序。
3. Basic Usage
3. 基本使用
3.1 Create a Session
3.1 新建一个 session
先 SSH 到服务器:
1 | |
然后创建一个名叫train的 tmux session:
1 | |
进入之后,你会看到一个普通 shell,只是底部多了一条 tmux status line。接着就可以运行你的程序:
1 | |
此时 terminal 里大概会像这样:
1 | |
这里的关键点是:python train.py运行在train这个 tmux session 里面。
3.2 Detach from tmux
3.2 离开 session,但不停止程序
如果你想离开 tmux,但让程序继续跑:
1 | |
更准确地说:
- 按住
Ctrl再按b; - 松开;
- 再按
d。
Ctrl-b是 tmux 默认的 prefix key。它的意思是告诉 tmux:“接下来这个按键是给 tmux 的,不是给 shell 或 Python 程序的。”
detach 后,你会回到普通 shell,并看到类似信息:
1 | |
可以用下面命令确认 session 还在:
1 | |
输出大概如下:
1 | |
这时即使你退出 SSH:
1 | |
train这个 tmux session 仍然在服务器后台运行,里面的训练程序也会继续跑。
如果不是你主动 detach,而是网络突然断开、Terminal 被关掉,tmux session 通常也会继续留在服务器上。只是为了工作流更清楚,我建议养成手动Ctrl-b d再退出 SSH 的习惯。
3.3 Attach Back Later
3.3 之后重新连回来
过一段时间,你重新 SSH 到服务器:
1 | |
然后 attach 回刚才的 session:
1 | |
重新进入后,你会看到之前那个程序还在原来的 session 里:
1 | |
你会回到同一个工作状态,就像这个 Terminal 从来没有断开过一样。
如果你只记一个完整工作流,我建议记这个:
1 | |
4. One Terminal, Multiple Programs
4. 一个 Terminal 里跑多个程序
tmux另一个非常舒服的地方是:一个 SSH terminal 里面可以组织多个程序。
你可以用两种方式:
- window:像浏览器标签页一样,一个 window 做一件事;
- pane:像分屏一样,一个 window 里同时看到多个程序。
4.1 Panes
4.1 分屏
常用 pane 快捷键如下:
| Key | Meaning |
|---|---|
Ctrl-b % |
左右分屏 |
Ctrl-b " |
上下分屏 |
Ctrl-b arrow |
切换 pane |
Ctrl-b z |
放大/恢复当前 pane |
Ctrl-b x |
关闭当前 pane |
比如训练模型时,我可能会这样组织:
- 左上:
python train.py; - 右上:
watch -n 1 nvidia-smi; - 下方:
tail -f logs/train.log。
用文字画出来,大概是这样的结构:
1 | |
这比开三个 SSH 窗口舒服很多,因为它们属于同一个 session。你 detach 的时候,它们会一起留在服务器上。
4.2 Windows
4.2 多个 window
如果程序很多,不建议无限分屏,因为屏幕会越来越挤。这时候可以用 window。
常用 window 快捷键如下:
| Key | Meaning |
|---|---|
Ctrl-b c |
新建 window |
Ctrl-b n |
下一个 window |
Ctrl-b p |
上一个 window |
Ctrl-b 0到Ctrl-b 9 |
跳到对应编号 window |
Ctrl-b , |
重命名当前 window |
Ctrl-b w |
列出并选择 window |
例如:
0:shell:普通 shell;1:train:训练程序;2:logs:日志;3:monitor:GPU 或 CPU 监控。
在 tmux 底部 status line 里,window 会显示成类似这样:
1 | |
我的建议是:
pane 用来同时观察,window 用来分类任务。
5. Practical Workflow
5. 服务器上跑长期任务的推荐流程
下面以训练模型为例。
5.1 Start Work
5.1 开始任务
1 | |
这里用了tee,是为了让输出既显示在屏幕上,也保存到日志文件里。
如果你不需要保存日志,直接运行:
1 | |
也可以。
5.2 Leave Safely
5.2 安全离开
1 | |
然后:
1 | |
这时候你可以关电脑、换网络、回家,程序继续在服务器里跑。
5.3 Come Back
5.3 回来继续看
1 | |
如果你忘记 session 名字:
1 | |
如果你希望“有就 attach,没有就新建”,可以用:
1 | |
这个命令很适合放进肌肉记忆里。
6. Useful Commands
6. 常用命令速查
6.1 Outside tmux
6.1 在普通 shell 里用
| Command | Meaning |
|---|---|
tmux new -s train |
新建并进入train session |
tmux new -A -s train |
有train就进入,没有就创建 |
tmux ls |
列出所有 sessions |
tmux attach -t train |
进入train session |
tmux rename-session -t train exp1 |
重命名 session |
tmux kill-session -t train |
关闭整个 session |
如果把常用命令写成 terminal note,大概是:
1 | |
6.2 Inside tmux
6.2 在 tmux 里面用
| Key | Meaning |
|---|---|
Ctrl-b d |
detach,离开但保持程序运行 |
Ctrl-b c |
新建 window |
Ctrl-b n |
下一个 window |
Ctrl-b p |
上一个 window |
Ctrl-b % |
左右分屏 |
Ctrl-b " |
上下分屏 |
Ctrl-b arrow |
切换 pane |
Ctrl-b z |
放大/恢复当前 pane |
Ctrl-b [ |
进入 copy mode,可以滚动查看历史输出 |
Ctrl-b ? |
查看默认快捷键帮助 |
其中最重要的是:
1 | |
这个动作是 tmux 入门的分水岭。理解了 detach/attach,就理解了 tmux 解决 SSH 断连问题的核心。
7. Caveats
7. 注意事项
7.1 tmux is Not Magic
7.1 tmux不是魔法
tmux可以帮你抵抗 SSH 断连,但不能保证程序永远不死。
下面这些情况,tmux不能解决:
- 服务器重启;
- 程序自己报错退出;
- 进程被
kill; - GPU/CPU/内存资源不足;
- 集群系统要求你使用 Slurm、PBS 等调度器。
如果是生产服务,应该考虑systemd、supervisor、Docker restart policy 等工具。
如果是 HPC 集群上的计算任务,通常应该按平台要求使用sbatch、qsub等调度命令。
tmux最适合的是:交互式服务器工作流。
7.2 tmux vs nohup
7.2 tmux和nohup怎么选
有些时候你也会看到:
1 | |
nohup也可以让命令在退出 shell 后继续运行,但它更适合“不需要再交互”的任务。
我会这样选择:
| Situation | Recommendation |
|---|---|
| 想随时回到程序界面继续看输出 | tmux |
| 想在一个 SSH 里同时看训练、日志、GPU | tmux |
| 只是丢一个后台任务,不需要交互 | nohup |
| 需要任务失败自动重启 | systemd/supervisor |
| 集群排队计算 | Slurm/PBS 等调度器 |
对于初学服务器的人,我认为先学tmux最划算,因为它马上解决日常痛点。
Summary
总结
tmux解决的不是“如何让程序更快”,而是“如何让服务器工作流更稳定、更可恢复、更有秩序”。
这篇文章最想强调的只有三件事:
- 在服务器上跑长期任务时,先进入
tmuxsession; - 离开时用
Ctrl-b ddetach,不要担心 SSH 断开; - 回来时用
tmux attach -t session_name继续工作。
最后再放一遍最短流程:
1 | |
这个小工具不复杂,但会让服务器使用体验舒服很多。
References
tmux Project. Getting Started. https://github.com/tmux/tmux/wiki/Getting-Started (accessed June 16, 2026).
tmux Project. Installing. https://github.com/tmux/tmux/wiki/Installing (accessed June 16, 2026).
OpenBSD. tmux(1) manual page. https://man.openbsd.org/tmux (accessed June 16, 2026).
原创文章,转载请标明出处
Made by Mike_Zhang
