Bash 中 nohup 与 的区别及用法解析
在 Bash 中,nohup
和 &
都可以用来在后台运行命令,但它们的作用和用途各有不同。以下将详细介绍它们的特点、区别及适用场景。
1. &
(后台运行)
&
是 Bash 的一个特殊符号,用于将命令放到后台执行。它的主要功能是让命令在后台运行,不会阻塞当前终端。
特点:
- 后台执行:命令会在后台运行,用户可以继续在当前终端执行其他操作。
- 依赖终端:尽管命令在后台运行,但它仍然依赖于当前终端。如果终端关闭(例如 SSH 连接断开),该后台进程可能会被终止。
- 输出到终端:命令的标准输出和错误输出仍然发送到当前终端,可能导致屏幕混乱。
示例:
./long_running_script.sh &
上述命令会将脚本放到后台运行。但如果终端关闭(如断开 SSH 连接),脚本可能会被终止。
2. nohup
(忽略挂起信号)
nohup
是一个命令,用于让进程忽略挂起信号(SIGHUP
),从而确保进程在终端关闭后仍然能够继续运行。nohup
的名称来源于 “no hang up”(不挂起)。
特点:
- 忽略挂起信号:即使终端关闭,进程也不会被终止。
- 默认输出:如果未明确指定输出文件,
nohup
会将标准输出和错误输出重定向到文件nohup.out
。 - 不一定后台运行:
nohup
本身不会将命令放到后台运行,但可以与&
结合使用实现后台运行。
示例:
nohup ./long_running_script.sh &
上述命令会确保脚本即使在终端关闭后也能继续运行,且输出默认会被重定向到 nohup.out
文件。
3. disown
(取消作业控制)
disown
是一个用于从当前终端的作业控制中移除后台进程的命令。它通常与 &
配合使用,确保进程在终端关闭后继续运行。
特点:
- 通过
disown
,后台进程将不再受当前终端的控制。 - 一旦移除,终端关闭对该进程不会产生影响。
示例:
./long_running_script.sh &
disown
上述命令先将脚本放到后台运行,然后通过 disown
将其从作业控制中移除,确保终端关闭后脚本继续运行。
区别对比
功能 | & | nohup | disown |
---|---|---|---|
后台运行 | 是 | 可结合 & 实现 | 通常与 & 配合使用 |
是否依赖终端 | 是(终端关闭会终止) | 否(忽略挂起信号) | 否(取消作业控制) |
输出重定向 | 否(默认输出到终端) | 默认重定向到 nohup.out (可更改) | 不影响输出 |
常用场景 | 简单的后台任务 | 长时间运行且需保持运行的任务 | 已启动的后台任务需要保持运行 |
推荐用法
在实际场景中,如果希望命令在后台运行且在终端关闭后继续执行,可以结合使用以下命令:
nohup ./long_running_script.sh > output.log 2>&1 &
解释:
nohup
:确保进程不会因终端关闭而被终止。> output.log
:将标准输出重定向到output.log
文件。2>&1
:将错误输出也重定向到相同的文件。&
:将命令放到后台运行。
通过上述组合,可以安全地运行后台任务,并将输出记录到指定文件中,便于后续分析。
总结
&
:适合不依赖终端关闭的简单后台任务。nohup
:用于长时间运行的任务,避免受终端关闭影响。disown
:对已经在后台运行的任务提供额外的安全性,确保其不受终端控制。
选择适合的工具和组合方式,可以高效完成任务,同时保证系统的稳定性和可操作性。