为什么使用“nohup &”而不是“exec &”

lox*_*axs 71 nohup exec

我知道,nohup作为一个二进制文件,它可以从任何 shell 访问。但是exec内置的可能存在于每个 shell 中。

是否有理由更喜欢其中一个?

Gil*_*il' 123

鱼和自行车哪个更好?nohupexec做不同的事情。

exec用另一个程序替换外壳。用exec一个简单的后台作业是没有用的:exec myprogram; more stuff与替换外壳myprogram,因此不运行more stuff,不像myprogram; more stuff它运行more stuffmyprogram终止; 但是在后台exec myprogram & more stuff启动myprogram然后运行more stuff,就像myprogram & more stuff.

nohup在忽略 SIGHUP 信号的情况下运行特定程序。当终端关闭时,内核将 SIGHUP 发送到该终端(即 shell)中的控制进程。Shell 依次向后台运行的所有作业发送 SIGHUP。nohup如果终端死机(例如,如果您远程登录并且连接断开,或者如果您关闭终端模拟器,就会发生这种情况),运行带有可防止它以这种方式被杀死。

nohup还将程序的输出重定向到文件nohup.out. 这可以避免程序因无法写入其输出或错误输出而死亡。请注意,nohup这不会重定向输入。要完全断开程序与启动它的终端的连接,请使用

nohup myprogram </dev/null >myprogram.log 2>&1 &
Run Code Online (Sandbox Code Playgroud)

  • 自行车 &gt; 一条鱼 (33认同)
  • 我不敢苟同。如果可以实施,鱼显然是一种优越的运输方式。 (9认同)
  • @THISUSERNEEDSHELP 但是自行车肯定是更好的食物吗? (9认同)
  • 给一个人一条鱼,你就能养活他一天。给一个人一辆自行车,他可以骑着它去超市买鱼一辈子。 (9认同)
  • @GypsyCosmonaut 运行 `exec firefox` 后,shell 不再运行:它已被替换为 `firefox`。您可以将 `exec` 视为组合退出程序和启动新程序,但保持相同的进程 ID。*[终端](https://unix.stackexchange.com/questions/4126/what-is-the-exact-difference-between-a-terminal-a-shell-a-tty-and-a-con) * 继续运行,因为没有任何东西告诉它停止。当您稍后退出 Firefox 时,`firefox` 进程将终止。终端注意到它的子进程已经退出,所以它依次退出。 (5认同)

小智 21

exec & => 将进程作为后台进程执行,因此您可以继续使用相同的终端进行其他作业。

nohup => 避免所有 SIGHUP(终止信号)并继续执行,即使您的终端已关闭。

exec进程在SIGHUP收到a 时终止,但nohup进程继续。

  • 我的意思是它不会像您通常想到的那样被执行(替换当前正在运行的 shell)——它只是作为后台进程运行。我想它可能与 `(exec smth) &amp;` 相同。但我不希望它是一样的 - 我希望它是一个语法错误,你怎么能执行一个进程(替换你自己)然后后台执行进程?你不再需要这样做了。 (2认同)