🧠 nohup
与 &
的作用及区别详解
一、什么是 nohup
?
- 含义:
nohup
是 “no hang up” 的缩写,意为“不挂断”。 - 功能:运行指定命令时忽略所有 SIGHUP(挂断)信号,即使终端关闭或会话结束,进程依然继续执行。
二、什么是 &
?
- 作用:将命令放入后台运行。
- 特点:
- 命令在后台执行,不影响当前终端的使用。
- 进程仍然连接到当前终端,接收标准输入输出。
✅ nohup
与 &
的主要区别
特性 | nohup command | command & | nohup command & |
---|
是否忽略 SIGHUP | ✅ 是 | ❌ 否 | ✅ 是 |
是否免疫 SIGINT (Ctrl+C) | ❌ 否 | ✅ 是 | ❌ 否 |
是否可接受标准输入 | ❌ 关闭 | ✅ 可以 | ✅ 可以(取决于具体环境) |
标准输出重定向 | ✅ 默认重定向到 nohup.out | ❌ 输出仍在终端 | ✅ 默认重定向到 nohup.out |
是否适合长时间运行任务 | ✅ 推荐 | ❌ 不推荐 | ✅ 强烈推荐 |
🔁 信号说明
信号 | 触发方式 | 默认行为 | nohup 是否免疫 | & 是否免疫 |
---|
SIGINT (Ctrl+C ) | 用户中断 | 终止进程 | ❌ 否 | ✅ 是 |
SIGHUP (关闭终端/退出SSH) | 会话结束 | 终止进程 | ✅ 是 | ❌ 否 |
📄 输入输出行为
1. nohup command
- 标准输入:自动关闭
- 标准输出 / 错误输出:
- 自动重定向到当前目录下的
nohup.out
- 如果无法写入当前目录,则尝试写入
$HOME/nohup.out
- 示例:
nohup ./my_script.sh
2. command &
- 标准输入/输出仍绑定到当前终端
- 如果关闭终端,进程会被终止(除非同时使用
nohup
) - 示例:
./my_script.sh &
3. nohup command &
- 最常用组合,兼顾后台运行和防止挂断
- 标准输入关闭,输出重定向到
nohup.out
- 即使关闭终端、SSH连接,程序依然运行
- 示例:
nohup ./my_script.sh &
📌 实际应用建议
使用场景 | 推荐命令 | 说明 |
---|
长时间运行任务(如服务、脚本) | nohup command > output.log 2>&1 & | 安全可靠,避免被挂断,输出可记录 |
快速测试后台执行 | command & | 临时使用,关闭终端后进程消失 |
后台运行但需要交互 | nohup command & | 注意可能无法再输入,需提前重定向 |
🧩 示例对比
示例 1:仅使用 &
sh test.sh &
- ✅ 在后台运行
- ❌ 关闭终端后进程终止
- ⚠️ 输出仍在当前终端窗口
示例 2:仅使用 nohup
nohup sh test.sh
- ✅ 即使关闭终端也不会终止
- ❌ 前台运行,占用当前终端
- ✅ 输出重定向到
nohup.out
示例 3:结合使用(推荐)
nohup sh test.sh > mylog.log 2>&1 &
- ✅ 在后台运行
- ✅ 即使关闭终端也继续运行
- ✅ 输出重定向到
mylog.log
- ✅ 安全且适合生产环境
📝 总结一句话:
&
让程序在后台运行,nohup
让程序不因终端关闭而终止。两者结合使用(nohup ... &
),是线上部署长时间任务的最佳实践。