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

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

相关推荐
博语小屋6 小时前
设计一个简单的网络计算器并将其守护进程化
linux·网络·tcp/ip
星火开发设计6 小时前
枚举类 enum class:强类型枚举的优势
linux·开发语言·c++·学习·算法·知识
喜欢吃燃面11 小时前
Linux:环境变量
linux·开发语言·学习
代码游侠11 小时前
ARM开发——阶段问题综述(二)
运维·arm开发·笔记·单片机·嵌入式硬件·学习
张祥64228890412 小时前
误差理论与测量平差基础笔记十
笔记·算法·机器学习
佑白雪乐15 小时前
<Linux基础第10集>复习前面内容
linux·运维·服务器
春日见15 小时前
自动驾驶规划控制决策知识点扫盲
linux·运维·服务器·人工智能·机器学习·自动驾驶
暮云星影15 小时前
四、linux系统 应用开发:UI开发环境配置概述 (三)
linux·ui·arm
云边散步15 小时前
godot2D游戏教程系列二(4)
笔记·学习·游戏开发
BORN(^-^)15 小时前
《产品经理方法论》阅读笔记
笔记·产品经理