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

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

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

有理由选择其中一个而不是另一个吗?

答案1

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

exec用另一个程序替换 shell。exec在简单的后台作业中使用并没有什么用处:exec myprogram; more stuff将 shell 替换为myprogramand 因此不会运行more stuff,这与终止时myprogram; more stuff运行不同;但在后台启动然后运行,就像.more stuffmyprogramexec myprogram & more stuffmyprogrammore stuffmyprogram & more stuff

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

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

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

答案2

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

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

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

答案3

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

nohup <command> 命令将运行<command>,但不会挂起(kill -s 1),因此当启动该命令的终端 shell 关闭时,该命令不会终止。首先在后台运行它,创建一个子 shell,然后该命令在后台运行,让您返回到提示符。

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

答案4

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

相关内容