Bash 中 nohup 与 & 的区别及用法解析

在 Bash 中,nohup& 都可以用来在后台运行命令,但它们的作用和用途各有不同。以下将详细介绍它们的特点、区别及适用场景。


1. &(后台运行)

& 是 Bash 的一个特殊符号,用于将命令放到后台执行。它的主要功能是让命令在后台运行,不会阻塞当前终端。

特点

  • 后台执行:命令会在后台运行,用户可以继续在当前终端执行其他操作。
  • 依赖终端:尽管命令在后台运行,但它仍然依赖于当前终端。如果终端关闭(例如 SSH 连接断开),该后台进程可能会被终止。
  • 输出到终端:命令的标准输出和错误输出仍然发送到当前终端,可能导致屏幕混乱。

示例

bash 复制代码
./long_running_script.sh &

上述命令会将脚本放到后台运行。但如果终端关闭(如断开 SSH 连接),脚本可能会被终止。


2. nohup(忽略挂起信号)

nohup 是一个命令,用于让进程忽略挂起信号(SIGHUP),从而确保进程在终端关闭后仍然能够继续运行。nohup 的名称来源于 "no hang up"(不挂起)。

特点

  • 忽略挂起信号:即使终端关闭,进程也不会被终止。
  • 默认输出 :如果未明确指定输出文件,nohup 会将标准输出和错误输出重定向到文件 nohup.out
  • 不一定后台运行nohup 本身不会将命令放到后台运行,但可以与 & 结合使用实现后台运行。

示例

bash 复制代码
nohup ./long_running_script.sh &

上述命令会确保脚本即使在终端关闭后也能继续运行,且输出默认会被重定向到 nohup.out 文件。


3. disown(取消作业控制)

disown 是一个用于从当前终端的作业控制中移除后台进程的命令。它通常与 & 配合使用,确保进程在终端关闭后继续运行。

特点

  • 通过 disown,后台进程将不再受当前终端的控制。
  • 一旦移除,终端关闭对该进程不会产生影响。

示例

bash 复制代码
./long_running_script.sh &
disown

上述命令先将脚本放到后台运行,然后通过 disown 将其从作业控制中移除,确保终端关闭后脚本继续运行。


区别对比

功能 & nohup disown
后台运行 可结合 & 实现 通常与 & 配合使用
是否依赖终端 是(终端关闭会终止) 否(忽略挂起信号) 否(取消作业控制)
输出重定向 否(默认输出到终端) 默认重定向到 nohup.out(可更改) 不影响输出
常用场景 简单的后台任务 长时间运行且需保持运行的任务 已启动的后台任务需要保持运行

推荐用法

在实际场景中,如果希望命令在后台运行且在终端关闭后继续执行,可以结合使用以下命令:

bash 复制代码
nohup ./long_running_script.sh > output.log 2>&1 &

解释

  1. nohup:确保进程不会因终端关闭而被终止。
  2. > output.log :将标准输出重定向到 output.log 文件。
  3. 2>&1:将错误输出也重定向到相同的文件。
  4. &:将命令放到后台运行。

通过上述组合,可以安全地运行后台任务,并将输出记录到指定文件中,便于后续分析。


总结

  • &:适合不依赖终端关闭的简单后台任务。
  • nohup:用于长时间运行的任务,避免受终端关闭影响。
  • disown:对已经在后台运行的任务提供额外的安全性,确保其不受终端控制。

选择适合的工具和组合方式,可以高效完成任务,同时保证系统的稳定性和可操作性。

相关推荐
qq_12498707532 分钟前
Java+SpringBoot+Vue+数据可视化的综合健身管理平台(程序+论文+讲解+安装+调试+售后)
java·开发语言·spring boot·毕业设计
煤炭里de黑猫2 分钟前
Lua C API:深入理解 lua_pushnumber 函数 — 将数字压入 Lua 栈中
开发语言·lua
哥坐11路7 分钟前
网络IP跳动问题解决详
开发语言·php
小丑西瓜66625 分钟前
分布式简单理解
linux·redis·分布式·架构·架构演变
奔跑吧邓邓子30 分钟前
【Python爬虫(27)】探索数据可视化的魔法世界
开发语言·爬虫·python·数据可视化
code bean41 分钟前
【C# 数据结构】队列 FIFO
开发语言·数据结构·c#
高hongyuan1 小时前
计算机网络
linux·计算机网络
Shuzi_master71 小时前
<02.21>八股文
java·开发语言
元亓亓亓1 小时前
java后端开发day18--学生管理系统
java·开发语言
EPSDA1 小时前
Linux线程池
linux·运维·服务器·开发语言·c++