我知道,nohup
作为一个二进制文件,可以从任何 shell 访问它。但exec
内置的可能存在于每个 shell 中。
有理由选择其中一个而不是另一个吗?
答案1
鱼和自行车哪个更好?nohup
并exec
做不同的事情。
exec
用另一个程序替换 shell。exec
在简单的后台作业中使用并没有什么用处:exec myprogram; more stuff
将 shell 替换为myprogram
and 因此不会运行more stuff
,这与终止时myprogram; more stuff
运行不同;但在后台启动然后运行,就像.more stuff
myprogram
exec myprogram & more stuff
myprogram
more stuff
myprogram & 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(终止信号)并继续执行,即使您的终端已关闭。
exec
SIGHUP
当收到a 时,进程终止,但nohup
进程继续。
答案3
shell内置命令exec <command>
将shell替换为<command>
,没有新进程,也没有创建新的PID。通常完成后<command>
您的终端将关闭。首先在后台运行它会创建一个子 shell,然后类似地立即被替换为<command>
.
该nohup <command>
命令将运行<command>
,但不会挂起(kill -s 1),因此当启动该命令的终端 shell 关闭时,该命令不会终止。首先在后台运行它,创建一个子 shell,然后该命令在后台运行,让您返回到提示符。
在脚本编写中,即时效果或多或少是相同的,<command>
都是由脚本启动,并且脚本将继续,而无需等待<command>
启动、发送输出或完成。
答案4
你无法nohup
与exec
.当您使用 运行可执行文件时nohup
,注销(ssh 会话)时该进程不会被终止;通常nohup
与 一起使用nice
以较低优先级运行进程。按照惯例,该HUP
信号是终端警告相关进程注销的方式