Linux 服务器后台任务生存指南
------ 让命令行在断网、重启、关机后依然存活
📌 目录
- 为什么需要"后台命令"
- 选型速览表
- nohup:最简断网保护罩
- & + disown:把作业踢出终端
- bg/fg:前台↔后台瞬移
- setsid:新会话隔离
- screen:终端复用老牌神器
- tmux:终端复用终极武器
- 实战:Tmux 完整工作流
- 重启后还原所有会话
- 一键脚本:新建/进入会话
- 总结 & 速查表
1. 为什么需要"后台命令"
- SSH 一断,前台任务全灭
- 训练模型、编译、仿真:需要持久运行 + 随时回看日志
- 纯
&并不保险:SIGHUP、终端关闭、网络抖动都会杀死进程
2. 选型速览表
| 场景 | 推荐命令 | 理由 |
|---|---|---|
| 一次性长任务 | nohup cmd & |
简单,日志文件化 |
| 脚本里后台 | cmd & disown |
一句搞定 |
| 已跑任务保活 | Ctrl-Z; bg; disown |
无需重跑 |
| 多人/多窗口 | tmux new -s foo |
断网无损,面板丰富 |
| 老系统无 tmux | screen -S foo |
预装多,稳定 |
3. nohup:最简断网保护罩
原理 :忽略 SIGHUP,终端退出后进程继续。
适用 :一次性长任务,无需交互。

bash
nohup python train.py > train.log 2>&1 &
文件结构:
train.log # 标准输出+错误
nohup.out # 若未重定向,默认日志
常用操作:
bash
jobs -l # 查看后台 jobID
kill %1 # 结束 job 1
tail -f train.log # 实时看日志
缺点:无法交互;不能回来看终端。
4. & + disown:把作业踢出终端
原理:先后台运行,再让 shell 忘记它。
bash
python train.py &
disown %1
一行写法:
bash
python train.py & disown
** vs nohup **:
- 日志默认仍在屏幕,可重定向
- 脚本里快速保活
5. bg/fg:前台↔后台瞬移
场景:已在跑的任务,想把它放到后台继续。
bash
python train.py # 跑着跑着发现要断网
Ctrl-Z # 挂起(暂停)
bg %1 # 放入后台继续跑
disown %1 # 可选:彻底脱离终端
拉回前台:
bash
fg %1
6. setsid:新会话隔离
原理:在新会话里启动进程,与当前终端完全脱钩。
bash
setsid python train.py
特点:
- 自动后台,无需
& - 父进程 init(systemd),断网不影响
- 日志默认
nohup.out
7. screen:终端复用老牌神器
功能 :一个 SSH 会话里开多个"虚拟屏",可 detach/attach。

bash
# 创建会话
screen -S train
# 在里面正常跑命令
python main.py
# detach(断开回话,任务继续)
Ctrl+A D
# 重新连接
screen -r train
常用键:
| 键 | 作用 |
|---|---|
| Ctrl+A ? | 帮助 |
| Ctrl+A C | 新建窗口 |
| Ctrl+A N/P | 切换窗口 |
| Ctrl+A D | detach |
优点 :系统预装多,简单稳定
缺点:分屏功能弱,配置较老
8. tmux:终端复用终极武器
功能 :窗口、面板、会话恢复、脚本化;断网后任务无损。
参考来源 :https://www.ruanyifeng.com/blog/2019/10/tmux.html

bash
# 新建会话
tmux new -s train
# 运行任务
python main.py
# detach(退出终端,任务继续)
Ctrl+B D `这个 时灵时不灵 刷脸`
# 重新进入
tmux attach -t train
面板操作(一个会话内多屏):
| 键 | 作用 |
|---|---|
| Ctrl+B % | 纵向分屏 |
| Ctrl+B " | 横向分屏 |
| Ctrl+B o | 切换面板 |
| Ctrl+B x | 关闭面板 |
| Ctrl+B ? | 帮助(q 退出) |
复制模式(滚动/选文):
bash
Ctrl+B [ # 进入复制模式
↑↓ / PgUp/PgDn # 滚动
Space → Enter # 选中文本
Ctrl+B ] # 粘贴
9. 实战:Tmux 完整工作流
bash
# 1. 新建带名字会话
tmux new -s code
# 2. 纵向分屏:左码右跑
Ctrl+B %
vim main.py
Ctrl+B o
python main.py
# 3. detach 离开(任务继续)
Ctrl+B D
# 4. 第二天重新接入
tmux attach -t code
# 5. 结束会话
exit # 退出所有面板即自动 kill
10. 重启后还原所有会话(可选插件)
-
安装插件管理器
bashgit clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm -
在
~/.tmux.conf写入set -g @plugin 'tmux-plugins/tmux-resurrect' set -g @plugin 'tmux-plugins/tmux-continuum' set -g @continuum-restore-on '100' -
重载配置
bashtmux source-file ~/.tmux.conf -
保存/还原
Ctrl+B Ctrl+s保存当前全部会话- 重启后
Ctrl+B Ctrl+r一键还原
11. 一键脚本:新建/进入会话
保存为 ~/bin/tmux-code:
bash
#!/bin/bash
SESSION=${1:-code}
tmux has-session -t $SESSION 2>/dev/null && \
tmux attach -t $SESSION || \
tmux new -s $SESSION
赋权使用:
bash
chmod +x ~/bin/tmux-code
echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
# 无论在哪,直接:
tmux-code
12. 总结 & 速查表
| 需求 | 命令 |
|---|---|
| 简单后台 | nohup cmd & |
| 已跑任务 | Ctrl-Z; bg; disown |
| 终端复用 | tmux new -s foo → Ctrl+B D → tmux attach -t foo |
记住 3 步:
tmux new -s foo Ctrl+B D tmux attach -t foo
恭喜您拥有了断网不断命令 的服务器终端!