Answers:
有什么好吃的,是鱼还是自行车?nohup
并exec
做不同的事情。
exec
用另一个程序替换外壳。用exec
一个简单的后台作业是没有用的:exec myprogram; more stuff
与替换外壳myprogram
,因此不运行more stuff
,不像myprogram; more stuff
运行它more stuff
时myprogram
终止; 但是exec myprogram & more stuff
从myprogram
后台开始然后运行more stuff
,就像myprogram & more stuff
。
nohup
在忽略SIGHUP信号的情况下运行特定程序。当终端关闭时,内核将SIGHUP发送到该终端(即外壳)中的控制进程。然后,Shell将SIGHUP发送到在后台运行的所有作业。运行带有的作业nohup
可防止终端死机(以此方式杀死终端)(例如,如果您远程登录并且连接断开,或者关闭了终端仿真器,则会发生这种情况)。
nohup
还将程序的输出重定向到file nohup.out
。这样可以避免程序死机,因为它无法写入其输出或错误输出。请注意,nohup
这不会重定向输入。要完全将程序与启动它的终端断开连接,请使用
nohup myprogram </dev/null >myprogram.log 2>&1 &
exec &
=>将一个进程作为后台进程执行,因此您可以继续使用同一终端执行其他作业。
nohup
=>避免所有SIGHUP(终止信号),即使终端关闭,也继续执行。
exec
SIGHUP
收到a时进程终止,但nohup
进程继续。
exec
替换正在运行的进程,但是当您使用&
exec'd命令的后台时,似乎并没有发生。无论是bash还是zsh。
exec smth &
与一样(exec smth) &
,这不是正在发生的事情吗?
(exec smth) &
。但是我不希望它是一样的-我希望它是一个语法错误,您如何执行一个进程(替换自己),然后后台执行该进程?您已不再需要这样做了。
内置的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(太长,无法在注释中将其复制到此处……)。我究竟做错了什么?