nohup
下面给出一份“从入门到进阶”的 nohup 使用指南。它既适合第一次听说这个命令的新手,也适合需要排查疑难问题的老手。你可以直接复制到博客或笔记中发布,全部原创、无版权问题。
================================================================
nohup 使用详解:让进程真正脱离终端
一、nohup 是什么
- 名称由来
nohup = “no hang up”,意为“不要挂断”。早期 Unix 通过调制解调器拨号登录,挂断电话线(hang up)会触发 SIGHUP 信号,导致所有子进程被杀死。nohup 的使命就是屏蔽 SIGHUP,使进程在会话结束后继续运行。 - 核心价值
• 让耗时任务(备份、训练模型、日志分析)不受 SSH 断开影响
• 作为守护进程/服务的最简单雏形
• 与 &、setsid、disown、tmux/screen 等工具对比,nohup 无需额外软件,单条命令即可生效
二、基本语法
nohup COMMAND [ARG]… [&] [>out.log 2>&1]
三、快速上手 3 步曲
- 登录服务器
ssh user@host - 启动任务
nohup python3 long_job.py –epochs 100 >train.log 2>&1 &
解释:
• & 表示后台运行
• >train.log 将标准输出重定向到文件
• 2>&1 把标准错误也合并进去 - 安全退出
exit 或 Ctrl-D。任务仍在后台跑,日志持续增长。
四、深入理解信号与文件描述符
- 信号处理
nohup 默认屏蔽 SIGHUP,但其他信号(SIGTERM、SIGKILL)依旧可以终止进程。
• kill PID → 发送 SIGTERM,进程可捕获并优雅退出
• kill -9 PID → 发送 SIGKILL,立即杀死,无法捕获 - 日志文件
• 如果未手动重定向,nohup 会把输出写入“nohup.out”(工作目录可写时)。
• 若工作目录不可写,则写入 $HOME/nohup.out。
• 多任务并发时务必手动指定不同日志文件,防止混叠。 - 文件描述符“黑洞”
如果既不需要输出也不关心错误,可重定向到 /dev/null:
nohup ./heavy_calc > /dev/null 2>&1 &
五、进阶用法
- 与 Shell job control 交互
• jobs -l 查看后台任务
• fg %1 把任务拉回前台
• bg %1 继续暂停的任务
• disown -h %1 让 bash 不再追踪该 job(效果类似 nohup 但可后补) - 与 cron 区别
cron 定时触发;nohup 手动触发。二者可组合:
@reboot nohup /opt/monitor/start.sh >> /var/log/monitor.log 2>&1 - 与 setsid 对比
setsid 创建新会话,彻底脱离控制终端;nohup 仍留在原会话,只是忽略 SIGHUP。
setsid ./daemon - 多命令/管道
使用子 Shell:
nohup sh -c ‘cmd1 | cmd2 && cmd3’ >pipe.log 2>&1 & - 环境变量与相对路径
在 crontab 或 systemd 中调用 nohup 时,务必写绝对路径或先 cd:
0 3 * * * cd /data/backup && nohup ./backup.sh >backup.log 2>&1
六、常见问题排查
- 进程还是挂了?
• 检查是否收到 SIGTERM(运维批量 killall)。
• 用 strace/truss 跟踪信号:strace -p PID -e signal。 - 日志没写入?
• 确认文件系统未满(df -h)。
• 确认重定向语法(>file 2>&1 顺序不能反)。 - 中文/彩色日志乱码
• 设置 LANG=en_US.UTF-8 nohup your_cmd … - 多台机器并行
• 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/