nohup

下面给出一份“从入门到进阶”的 nohup 使用指南。它既适合第一次听说这个命令的新手,也适合需要排查疑难问题的老手。你可以直接复制到博客或笔记中发布,全部原创、无版权问题。

================================================================
nohup 使用详解:让进程真正脱离终端

一、nohup 是什么

  1. 名称由来
    nohup = “no hang up”,意为“不要挂断”。早期 Unix 通过调制解调器拨号登录,挂断电话线(hang up)会触发 SIGHUP 信号,导致所有子进程被杀死。nohup 的使命就是屏蔽 SIGHUP,使进程在会话结束后继续运行。
  2. 核心价值
    • 让耗时任务(备份、训练模型、日志分析)不受 SSH 断开影响
    • 作为守护进程/服务的最简单雏形
    • 与 &、setsid、disown、tmux/screen 等工具对比,nohup 无需额外软件,单条命令即可生效

二、基本语法
nohup COMMAND [ARG]… [&] [>out.log 2>&1]

三、快速上手 3 步曲

  1. 登录服务器
    ssh user@host
  2. 启动任务
    nohup python3 long_job.py –epochs 100 >train.log 2>&1 &
    解释:
    • & 表示后台运行
    • >train.log 将标准输出重定向到文件
    • 2>&1 把标准错误也合并进去
  3. 安全退出
    exit 或 Ctrl-D。任务仍在后台跑,日志持续增长。

四、深入理解信号与文件描述符

  1. 信号处理
    nohup 默认屏蔽 SIGHUP,但其他信号(SIGTERM、SIGKILL)依旧可以终止进程。
    • kill PID → 发送 SIGTERM,进程可捕获并优雅退出
    • kill -9 PID → 发送 SIGKILL,立即杀死,无法捕获
  2. 日志文件
    • 如果未手动重定向,nohup 会把输出写入“nohup.out”(工作目录可写时)。
    • 若工作目录不可写,则写入 $HOME/nohup.out。
    • 多任务并发时务必手动指定不同日志文件,防止混叠。
  3. 文件描述符“黑洞”
    如果既不需要输出也不关心错误,可重定向到 /dev/null:
    nohup ./heavy_calc > /dev/null 2>&1 &

五、进阶用法

  1. 与 Shell job control 交互
    • jobs -l 查看后台任务
    • fg %1 把任务拉回前台
    • bg %1 继续暂停的任务
    • disown -h %1 让 bash 不再追踪该 job(效果类似 nohup 但可后补)
  2. 与 cron 区别
    cron 定时触发;nohup 手动触发。二者可组合:
    @reboot nohup /opt/monitor/start.sh >> /var/log/monitor.log 2>&1
  3. 与 setsid 对比
    setsid 创建新会话,彻底脱离控制终端;nohup 仍留在原会话,只是忽略 SIGHUP。
    setsid ./daemon
  4. 多命令/管道
    使用子 Shell:
    nohup sh -c ‘cmd1 | cmd2 && cmd3’ >pipe.log 2>&1 &
  5. 环境变量与相对路径
    在 crontab 或 systemd 中调用 nohup 时,务必写绝对路径或先 cd:
    0 3 * * * cd /data/backup && nohup ./backup.sh >backup.log 2>&1

六、常见问题排查

  1. 进程还是挂了?
    • 检查是否收到 SIGTERM(运维批量 killall)。
    • 用 strace/truss 跟踪信号:strace -p PID -e signal。
  2. 日志没写入?
    • 确认文件系统未满(df -h)。
    • 确认重定向语法(>file 2>&1 顺序不能反)。
  3. 中文/彩色日志乱码
    • 设置 LANG=en_US.UTF-8 nohup your_cmd …
  4. 多台机器并行
    • ansible、fabric、pssh 均可远程执行 nohup:
    ansible webservers -m shell -a “nohup /opt/deploy.sh >deploy.log 2>&1 &”

七、完整范例
需求:训练一个 50 epoch 的 PyTorch 模型,断网后仍能继续,训练完自动关机。

train.sh

#!/bin/bash
cd /data/project
source venv/bin/activate
python train.py –epochs 50 –save model.pt
sudo shutdown -h now

启动:
nohup ./train.sh >train_full.log 2>&1 &

八、与 systemd 的取舍
• 长期服务请优先 systemd:支持自动重启、资源限制、日志轮转。
• 临时/一次性/无 root 权限任务用 nohup 最轻量。

九、一句话总结
nohup 不是“后台运行”,而是“让进程对 SIGHUP 免疫”;配合重定向与 &,它提供了在类 Unix 系统中最朴素的任务守护方案。记住:
nohup cmd >log 2>&1 &
exit

任务从此与你无关,却又始终在你掌控的日志里。

kimi-k2


nohup
https://blog.computerqwq.top/2025/08/10/nohup/
作者
计算机qwq
发布于
2025年8月10日
更新于
2025年8月10日
许可协议