Linux nohup命令实战指南

在服务器上跑深度学习训练时,我们经常遇到这些需求:

  • 关掉 SSH / 断网后训练不能停
  • 不想一直开着终端等输出
  • 想让日志落盘,方便复盘
  • 训练跑几天,随时能查看进度

这时候 nohup 是最经典、最简单、最稳的选择之一。

===============================================

1. nohup 到底做了什么?

nohup = no hang up:它会让你启动的程序 忽略挂断信号(SIGHUP),因此即使你退出终端、SSH断开,程序也能继续跑。

但注意:nohup 不是 守护进程管理器,它只是让程序"不因断线而死"。更高级的后台管理建议看 tmux/screen/systemd,但

nohup 足够解决 80% 的训练需求。

2. 最常用的 nohup 模板

python 复制代码
# 后台运行 + 输出到 log(标准写法)
nohup python train.py > train.log 2>&1 &

解释一下:

  • > train.log:标准输出 stdout 写入 train.log
  • 2>&1:标准错误 stderr 也重定向到 stdout(同一个 log)
  • &:放到后台运行

如果你不重定向输出,nohup 默认会写到 nohup.out(当前目录)。

3. 跑训练最推荐的版本:Python 无缓冲输出

很多人会遇到 "nohup 跑了,但 log 里很久没更新" 的情况。原因通常是 Python 输出缓冲(重定向到文件时会变得很"懒")。

强烈推荐你用 -u(unbuffered)或 PYTHONUNBUFFERED=1:

python 复制代码
# 推荐写法
nohup python -u train.py > train.log 2>&1 &

# 另一种:环境变量
PYTHONUNBUFFERED=1 nohup python train.py > train.log 2>&1 &

4. 指定 GPU、指定环境变量

python 复制代码
# 把环境变量放在 nohup 前面
CUDA_VISIBLE_DEVICES=0,1 nohup python -u train.py > train.log 2>&1 &

# 使用 env
nohup env CUDA_VISIBLE_DEVICES=0,1 python -u train.py > train.log 2>&1 &

注:反例:很多人会写成这样然后报 Exit 127(命令找不到)

nohup CUDA_VISIBLE_DEVICES=0,1 python train.py ...

因为 nohup 会把 CUDA_VISIBLE_DEVICES=0,1 当作"命令名"去执行

5. accelerate / 分布式训练的 nohup 模板

python 复制代码
# 如果你用 accelerate,多进程下也建议用无缓冲:
CUDA_VISIBLE_DEVICES=0,1 nohup accelerate launch --num_processes=2 --main_process_port=29501 .../train.py > output.log 2>&1 &
 
 # 如果你担心 accelerate 不在 PATH(nohup 环境不一致时偶发),可以用更稳的模块启动方式
 CUDA_VISIBLE_DEVICES=0,1 nohup python -u -m accelerate.commands.launch --num_processes=2 --main_process_port=29501 .../train.py > output.log 2>&1 &

6. 怎么确认它真的在跑?

python 复制代码
# 实时看日志
tail -f output.log

# 看进程还在不在
ps -ef | grep train.py

# 更快一点:
pgrep -af "accelerate|train.py"

7. 怎么优雅停止 nohup 启动的训练?

python 复制代码
# 先找到 pid
pgrep -af "train.py"
# 先尝试正常结束
kill <pid>
# 不行再强制杀
kill -9 <pid>

# 多卡/多进程,一次杀干净(慎用)
pkill -f train.py

8. 常见坑合集

坑 1:终端没打印,是不是没跑?

不是。你把输出都重定向到 log 了,终端当然不显示。用 tail -f 看即可。

坑 2:log 很久没更新,以为卡死

多数是 Python 缓冲。用 python -u 或 PYTHONUNBUFFERED=1。

坑 3:Exit 127

通常是 "命令找不到"。

常见原因:

  • nohup CUDA_VISIBLE_DEVICES=... xxx(把 env 当命令)
  • accelerate 不在 PATH(没激活环境 / conda 没继承)

坑 4:accelerate 多进程只有 rank0 打印

这是正常现象。你会看到日志没那么"热闹",但不代表没跑。

相关推荐
wdfk_prog17 小时前
[Linux]学习笔记系列 -- [drivers][input]input
linux·笔记·学习
七夜zippoe18 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
盟接之桥18 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
忆~遂愿18 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
湘-枫叶情缘18 小时前
1990:种下那棵不落叶的树-第6集 圆明园的对话
linux·系统架构
Fcy64819 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满19 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠19 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Gary Studio19 小时前
rk芯片驱动编写
linux·学习
mango_mangojuice19 小时前
Linux学习笔记(make/Makefile)1.23
java·linux·前端·笔记·学习