nohup和&符号之间有什么区别

时间:2013-03-24 05:01:36

标签: linux bash nohup

nohup myprocess.out &myprocess.out &都设置myprocess.out在后台运行。关闭终端后,进程仍在运行。 它们之间有什么区别?

6 个答案:

答案 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作为启动方法添加到第二个脚本之后,即使脚本将退出并且该行为在两种环境下都保持一致,应用程序仍将继续运行。