nohup myprocess.out &
或myprocess.out &
都设置myprocess.out在后台运行。关闭终端后,进程仍在运行。
它们之间有什么区别?
答案 0 :(得分:278)
nohup
捕捉到挂断信号(请参阅man 7 signal
)而&符号没有(除了shell以这种方式配置或根本不发送SIGHUP
)。
通常,当使用&
运行命令并在之后退出shell时,shell将使用挂断信号(kill -SIGHUP <pid>
)终止子命令。这可以使用nohup
来防止,因为它捕获信号并忽略它,以便它永远不会到达实际的应用程序。
如果你正在使用bash,你可以使用命令shopt | grep hupon
找出是否
您的shell是否将SIGHUP发送到其子进程。如果它关闭,进程将不会
终止,因为你似乎就是这样。有关bash如何终止的更多信息
应用程序可以找到here。
有些情况nohup
不起作用,例如当您开始重新连接的过程时
SIGHUP
信号,就像here一样。
答案 1 :(得分:33)
myprocess.out &
将使用子shell在后台运行该过程。如果当前shell终止(例如通过注销),则所有子shell也将终止,因此后台进程也将终止。 nohup命令忽略HUP
信号,因此即使当前shell终止,子shell和myprocess.out也会继续在后台运行。另一个区别是&
单独不会重定向stdout / stderr,所以如果有任何输出或错误,那么它们会显示在终端上。另一方面,nohup将stdout / stderr重定向到nohup.out或$ HOME / nohup.out。
答案 2 :(得分:22)
大多数时候我们使用ssh登录远程服务器。如果启动shell脚本并注销,则该进程将被终止。 Nohup有助于在从shell注销后继续在后台运行脚本。
Nohup command name &
eg: nohup sh script.sh &
Nohup捕捉到HUP信号。 Nohup不会自动将作业放在后台。我们需要明确地使用&amp;
来说明答案 3 :(得分:20)
使用&符号(&amp;)将在子进程中运行该命令(子进程到当前的bash会话)。但是,当您退出会话时,所有子进程都将被终止。
使用nohup +&符号(&amp;)将执行相同的操作,除了当会话结束时,子进程的父进程将更改为“1”,即“init”进程,从而保护子进程被杀了。
答案 4 :(得分:5)
如果我错了,请纠正我
nohup myprocess.out &
nohup 捕获挂断信号,这意味着它将在终端关闭时发送进程。
myprocess.out &
进程可以运行,但一旦终端关闭就会停止。
nohup myprocess.out
即使终端关闭也能运行,但您可以通过在终端中按ctrl
+ z
来停止此过程。如果Crt
存在,则z
+ &
无效。
答案 5 :(得分:0)
在许多情况下,环境之间的细微差异会刺伤您。这是我最近遇到的一个问题。这两个命令有什么区别?
1 ~ $ nohup myprocess.out &
2 ~ $ myprocess.out &
答案与平常相同-视情况而定。
nohup捕获挂断信号,而&符不捕获。
什么是挂断信号?
SIGHUP-在控制终端上检测到挂断或控制进程终止(值:1)。
通常,当使用&运行命令并随后退出shell时,shell将使用挂断信号终止子命令(例如kill -SIGHUP $ PID)。使用nohup可以防止这种情况,因为它会捕获信号并将其忽略,从而使其永远无法到达实际应用程序。
很好,但像在这种情况下,总是有“ buts”。当以完全不发送SIGHUP的方式配置外壳程序时,这两种启动方法之间没有什么区别。
如果您使用的是bash,则可以使用以下指定的命令来确定您的shell是否将SIGHUP发送到其子进程:
~ $ shopt | grep hupon
此外-在某些情况下,nohup无法正常工作。例如,当您开始的过程开始时,将重新连接NOHUP信号(在应用程序代码级别在内部完成)。
在所描述的情况下,在自定义服务启动脚本中调用第二个脚本的过程中没有差异,这困扰了我,它无需nohup命令即可设置并启动正确的应用程序。
在一个Linux环境中,一切都运行顺利,在第二个环境中,第二个脚本退出后,应用程序立即退出(检测到这种情况,我花了更多时间,所以您可能会觉得:stuck_out_tongue:)。
在将nohup作为启动方法添加到第二个脚本之后,即使脚本将退出并且该行为在两种环境下都保持一致,应用程序仍将继续运行。