Linux 服务器后台任务生存指南

Linux 服务器后台任务生存指南

------ 让命令行在断网、重启、关机后依然存活


📌 目录

  1. 为什么需要"后台命令"
  2. 选型速览表
  3. nohup:最简断网保护罩
  4. & + disown:把作业踢出终端
  5. bg/fg:前台↔后台瞬移
  6. setsid:新会话隔离
  7. screen:终端复用老牌神器
  8. tmux:终端复用终极武器
  9. 实战:Tmux 完整工作流
  10. 重启后还原所有会话
  11. 一键脚本:新建/进入会话
  12. 总结 & 速查表

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. 重启后还原所有会话(可选插件)

  1. 安装插件管理器

    bash 复制代码
    git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
  2. ~/.tmux.conf 写入

    复制代码
    set -g @plugin 'tmux-plugins/tmux-resurrect'
    set -g @plugin 'tmux-plugins/tmux-continuum'
    set -g @continuum-restore-on '100'
  3. 重载配置

    bash 复制代码
    tmux source-file ~/.tmux.conf
  4. 保存/还原

    • 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 fooCtrl+B Dtmux attach -t foo

记住 3 步

复制代码
tmux new -s foo   Ctrl+B D   tmux attach -t foo

恭喜您拥有了断网不断命令 的服务器终端!

相关推荐
一条破秋裤17 小时前
数据中心能耗预测
服务器
dz小伟17 小时前
从用户空间open()到驱动open()的完整调用链深度解析
linux
DeeplyMind17 小时前
第4章: MMU notifier内核实现机制
linux·驱动开发·mmu·mmu notifier
知识分享小能手17 小时前
Ubuntu入门学习教程,从入门到精通,Ubuntu 22.04 中的服务器 —— 知识点详解 (22)
服务器·学习·ubuntu
次元工程师!17 小时前
Sa-Token完成路由鉴权
java·服务器·前端
摸鱼仙人~17 小时前
RAG 系统中的 TOC Enhance:用“目录增强”提升检索与生成效果
linux·运维·服务器
_Kayo_17 小时前
Node.js 学习笔记6
笔记·学习·node.js
Autumn729917 小时前
【 jupyter 】PyCharm配置服务器连接jupyter
服务器·jupyter·pycharm
xingzhemengyou117 小时前
Linux dmesg 查看系统启动日志
linux