使用 tmux 让服务器程序持续运行

Made by Mike_Zhang


Unfold Linux Topics | 展开Linux主题 $\triangledown$


程序可以慢慢跑,但 SSH 不一定能一直连着。


NO BULLSHIT

30秒开门见山版

如果你只想解决一个问题:

我在服务器 Terminal 里运行了一个很久的程序,希望它不会因为 SSH 断开、电脑休眠、Terminal 关闭而中断。

那么可以先记住下面这组命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 1. SSH into the server
ssh username@server_ip

# 2. Create a tmux session named train
tmux new -s train

# 3. Run your long-running program inside tmux
python train.py

# 4. Detach from tmux
# Press Ctrl-b, release, then press d

# 5. List existing tmux sessions
tmux ls

# 6. Reattach to the session later
tmux attach -t train

简单来说:

  • tmux可以让程序在服务器上继续运行,即使你的 SSH 连接断了;
  • tmux里的核心单位是 session,你可以 detach 离开,也可以 attach 回来;
  • 一个 session 里面可以有多个 window,一个 window 里面可以分成多个 pane
  • 对服务器训练模型、下载数据、跑脚本、编译程序、看日志、监控 GPU 来说,tmux非常实用;
  • tmux不是任务调度系统。服务器重启、程序自己报错退出、被管理员杀掉,tmux救不了。

Intro

导言

在服务器上跑程序时,我们常常会遇到一个很现实的问题:

1
2
ssh username@server_ip
python train.py

程序开始跑了,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 代码块,并用bashtext标记命令和输出。这样更方便复制、搜索,也更接近真实命令行文本。


2. Installation

2. 安装

如果服务器已经装好了tmux,可以直接检查版本:

1
tmux -V

常见系统的安装方式如下:

1
2
3
4
5
6
7
8
9
10
11
# Debian / Ubuntu
sudo apt install tmux

# RHEL / CentOS
sudo yum install tmux

# Fedora
sudo dnf install tmux

# macOS with Homebrew
brew install tmux

注意:如果你是在远程服务器上跑程序,应该把tmux安装在服务器上。
在自己电脑本地装tmux当然也有用,但它不能保护远程服务器上没有进入 tmux 的程序。


3. Basic Usage

3. 基本使用

3.1 Create a Session

3.1 新建一个 session

先 SSH 到服务器:

1
ssh zhang@lab-server

然后创建一个名叫train的 tmux session:

1
tmux new -s train

进入之后,你会看到一个普通 shell,只是底部多了一条 tmux status line。接着就可以运行你的程序:

1
python train.py --epochs 100

此时 terminal 里大概会像这样:

1
2
3
4
5
6
zhang@lab-server:~/project$ python train.py --epochs 100
Epoch 001/100 | loss=2.301 | acc=0.102 | eta=05:31:42
Epoch 002/100 | loss=2.104 | acc=0.184 | eta=05:24:09
Epoch 003/100 | loss=1.917 | acc=0.253 | eta=05:17:52

[train] 0:train* "lab-server"

这里的关键点是:python train.py运行在train这个 tmux session 里面。


3.2 Detach from tmux

3.2 离开 session,但不停止程序

如果你想离开 tmux,但让程序继续跑:

1
Ctrl-b  d

更准确地说:

  1. 按住Ctrl再按b
  2. 松开;
  3. 再按d

Ctrl-b是 tmux 默认的 prefix key。它的意思是告诉 tmux:“接下来这个按键是给 tmux 的,不是给 shell 或 Python 程序的。”

detach 后,你会回到普通 shell,并看到类似信息:

1
[detached (from session train)]

可以用下面命令确认 session 还在:

1
tmux ls

输出大概如下:

1
2
3
4
5
[detached (from session train)]
zhang@lab-server:~$ tmux ls
train: 1 windows (created Thu May 28 14:00:25 2026)
zhang@lab-server:~$ exit
Connection to lab-server closed.

这时即使你退出 SSH:

1
exit

train这个 tmux session 仍然在服务器后台运行,里面的训练程序也会继续跑。

如果不是你主动 detach,而是网络突然断开、Terminal 被关掉,tmux session 通常也会继续留在服务器上。只是为了工作流更清楚,我建议养成手动Ctrl-b d再退出 SSH 的习惯。


3.3 Attach Back Later

3.3 之后重新连回来

过一段时间,你重新 SSH 到服务器:

1
ssh zhang@lab-server

然后 attach 回刚才的 session:

1
tmux attach -t train

重新进入后,你会看到之前那个程序还在原来的 session 里:

1
2
3
4
5
6
zhang@lab-server:~/project$ python train.py --epochs 100
Epoch 046/100 | loss=0.903 | acc=0.721 | eta=02:59:20
Epoch 047/100 | loss=0.889 | acc=0.728 | eta=02:56:44
Epoch 048/100 | loss=0.872 | acc=0.731 | eta=02:54:11

[train] 0:train* "lab-server"

你会回到同一个工作状态,就像这个 Terminal 从来没有断开过一样。

如果你只记一个完整工作流,我建议记这个:

1
2
3
4
5
6
7
8
9
ssh zhang@lab-server
tmux new -s train
python train.py
# Ctrl-b d
exit

# later
ssh zhang@lab-server
tmux attach -t train

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
2
3
4
5
6
7
8
9
10
11
12
13
+------------------------------- train -------------------------------+---------------- logs ---------------+
| zhang@lab-server:~/project$ python train.py | zhang@lab-server:~/project$ tail ... |
| Epoch 048/100 loss=0.872 acc=0.731 | [15:05:18] val_acc=0.728 |
| Epoch 049/100 loss=0.861 acc=0.739 | [15:06:55] val_acc=0.731 |
| saving checkpoint: checkpoints/e049.pt | [15:08:31] val_acc=0.748 |
| Epoch 050/100 loss=0.844 acc=0.748 | |
+---------------------------------------------------------------------+--------------------------------------+
| zhang@lab-server:~$ watch -n 1 nvidia-smi |
| GPU Name Mem-Usage Util |
| 0 RTX 4090 20342MiB 96% |
| 1 RTX 4090 1842MiB 12% |
+------------------------------------------------------------------------------------------------------------+
[project-a] 0:run* "lab-server"

这比开三个 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 0Ctrl-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
2
3
4
5
zhang@lab-server:~/project$ python train.py
Epoch 051/100 | loss=0.831 | acc=0.752 | eta=02:38:09
Epoch 052/100 | loss=0.817 | acc=0.761 | eta=02:35:32

[project-a] 0:shell 1:train* 2:logs 3:monitor "lab-server"

我的建议是:

pane 用来同时观察,window 用来分类任务。


5. Practical Workflow

5. 服务器上跑长期任务的推荐流程

下面以训练模型为例。

5.1 Start Work

5.1 开始任务

1
2
3
4
5
6
ssh zhang@lab-server
tmux new -s project-a
cd ~/project-a
conda activate myenv
mkdir -p logs
python train.py 2>&1 | tee logs/train.log

这里用了tee,是为了让输出既显示在屏幕上,也保存到日志文件里。

如果你不需要保存日志,直接运行:

1
python train.py

也可以。


5.2 Leave Safely

5.2 安全离开

1
Ctrl-b  d

然后:

1
2
tmux ls
exit

这时候你可以关电脑、换网络、回家,程序继续在服务器里跑。


5.3 Come Back

5.3 回来继续看

1
2
ssh zhang@lab-server
tmux attach -t project-a

如果你忘记 session 名字:

1
tmux ls

如果你希望“有就 attach,没有就新建”,可以用:

1
tmux new -A -s project-a

这个命令很适合放进肌肉记忆里。


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
2
3
4
5
6
7
8
9
10
11
zhang@lab-server:~$ tmux new -s train        # create session
zhang@lab-server:~$ tmux ls # list sessions
zhang@lab-server:~$ tmux attach -t train # reattach
zhang@lab-server:~$ tmux kill-session -t train

Inside tmux:
Ctrl-b d detach
Ctrl-b c new window
Ctrl-b % split left/right
Ctrl-b " split top/bottom
Ctrl-b arrow switch pane

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
Ctrl-b d

这个动作是 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 等调度器。

如果是生产服务,应该考虑systemdsupervisor、Docker restart policy 等工具。
如果是 HPC 集群上的计算任务,通常应该按平台要求使用sbatchqsub等调度命令。

tmux最适合的是:交互式服务器工作流


7.2 tmux vs nohup

7.2 tmux和nohup怎么选

有些时候你也会看到:

1
nohup python train.py > train.log 2>&1 &

nohup也可以让命令在退出 shell 后继续运行,但它更适合“不需要再交互”的任务。

我会这样选择:

Situation Recommendation
想随时回到程序界面继续看输出 tmux
想在一个 SSH 里同时看训练、日志、GPU tmux
只是丢一个后台任务,不需要交互 nohup
需要任务失败自动重启 systemd/supervisor
集群排队计算 Slurm/PBS 等调度器

对于初学服务器的人,我认为先学tmux最划算,因为它马上解决日常痛点。


Summary

总结

tmux解决的不是“如何让程序更快”,而是“如何让服务器工作流更稳定、更可恢复、更有秩序”。

这篇文章最想强调的只有三件事:

  1. 在服务器上跑长期任务时,先进入tmux session;
  2. 离开时用Ctrl-b d detach,不要担心 SSH 断开;
  3. 回来时用tmux attach -t session_name继续工作。

最后再放一遍最短流程:

1
2
3
4
5
6
7
8
ssh username@server_ip
tmux new -s train
python train.py
# Ctrl-b d
exit

ssh username@server_ip
tmux attach -t train

这个小工具不复杂,但会让服务器使用体验舒服很多。


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




感谢你的支持 | Thank you for supporting

使用 tmux 让服务器程序持续运行
https://ultrafish.io/post/tmux-keep-server-program-running/
Author
Mike_Zhang
Posted on
May 28, 2026
Licensed under