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


67

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

是否有理由偏爱其中一个?

Answers:


113

有什么好吃的,是鱼还是自行车?nohupexec做不同的事情。

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

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

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

nohup myprogram </dev/null >myprogram.log 2>&1 &

27
自行车>鱼
克里斯·杰恩斯

6
我不敢苟同。如果可以实施,鱼显然是一种更好的运输方式。
该用户需要帮助

6
@THISUSERNEEDSHELP但是,自行车当然是更好的食物吗?
吉尔斯

3
@GypsyCosmonaut运行后exec firefox,该外壳不再运行:它已被替换firefox。您可以exec将退出程序与启动新程序结合起来,但要保持相同的进程ID。该终端继续运行,因为没有告诉它停止。当您以后退出Firefox时,该firefox过程终止。终端会注意到其子进程已退出,因此依次退出。
吉尔斯

5
给一个人一条鱼,你就喂他一天。给一个男人骑自行车,他可以骑自行车去超市买一辈子的鱼。
David

18

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

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

execSIGHUP收到a时进程终止,但nohup进程继续。


1
这个答案似乎是正确的。正如上面的其他回答所述,通常会exec替换正在运行的进程,但是当您使用&exec'd命令的后台时,似乎并没有发生。无论是bash还是zsh。
丹·普里兹

@DanPritts这是什么意思呢?启动后台子进程然后将其替换,所以exec smth &与一样(exec smth) &,这不是正在发生的事情吗?
phk

1
我的意思是说,它不会像您通常会想到的那样被执行(替换当前正在运行的shell)-它只是作为后台进程运行。我想可能与相同(exec smth) &。但是我不希望它是一样的-我希望它是一个语法错误,您如何执行一个进程(替换自己),然后后台执行该进程?您已不再需要这样做了。
丹·普里兹

2

内置的shell命令exec <command>用替换了shell <command>,没有新进程,也没有创建新的PID。<command>正常完成后,您的终端将关闭。通过首先在后台运行它,将创建一个子shell,然后将其类似地立即替换为<command>

nohup <command> 命令将运行,<command>但会挂断(kill -s 1),因此在关闭作为启动它的终端的外壳程序时,它不会终止。通过首先在后台运行它,将创建一个子外壳,该命令在后台运行,使您返回到提示符。

在脚本编写中,即时效果或多或少是相同的,它<command>是由脚本启动的,脚本将继续运行而无需等待<command>启动,发送输出或完成。


我也不确定执行该做什么。我的意思是……我了解应该执行的操作,但是我只能看到“执行” script.sh &或“ 执行”之间的细微差别exec script.sh &。在这两种情况下,命令都是在子进程中执行的,它不能代替调用进程,请参见:paste.alacon.org/44474(太长,无法在注释中将其复制到此处……)。我究竟做错了什么?
斯特凡(Stéphane)

2

你不能比较nohupexec。当您使用运行可执行文件nohup时,注销(ssh会话)时该进程不会终止;通常nohup用于以nice较低优先级运行进程。按照HUP惯例,该信号是终端警告相关注销过程的方式

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.