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

问题描述 投票:209回答:6

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

linux bash nohup
6个回答
284
投票

nohup捕获了挂断信号(参见man 7 signal),而&符号没有(除了shell以这种方式配置或根本不发送SIGHUP)。

通常,当使用&运行命令并在之后退出shell时,shell将使用挂断信号(kill -SIGHUP <pid>)终止子命令。这可以使用nohup来防止,因为它捕获信号并忽略它,以便它永远不会到达实际的应用程序。

如果您正在使用bash,则可以使用命令shopt | grep hupon来确定您的shell是否将SIGHUP发送到其子进程。如果它关闭,进程将不会终止,因为您似乎就是这种情况。有关bash如何终止应用程序的更多信息,请访问here

有些情况下nohup不起作用,例如当你开始重新连接SIGHUP信号的过程时,就像here一样。


34
投票

myprocess.out &将使用子shell在后台运行该过程。如果当前shell终止(例如通过注销),则所有子shell也将终止,因此后台进程也将终止。 nohup命令忽略HUP信号,因此即使当前shell终止,子shell和myprocess.out也会继续在后台运行。另一个区别是单独的&没有重定向stdout / stderr所以如果有任何输出或错误,那么它们会显示在终端上。另一方面,nohup将stdout / stderr重定向到nohup.out或$ HOME / nohup.out。


23
投票

大多数时候我们使用ssh登录远程服务器。如果启动shell脚本并注销,则该进程将被终止。即使从shell注销,Nohup也有助于继续在后台运行脚本。

Nohup command name &
eg: nohup sh script.sh &

Nohup捕获了HUP信号。 Nohup不会自动将作业放在后台。我们需要告诉明确使用&


22
投票

使用&符号(&)将在子进程中运行该命令(子进程到当前的bash会话)。但是,退出会话时,将终止所有子进程。

使用nohup +&符号(&)将执行相同的操作,除了当会话结束时,子进程的父进程将更改为“1”,这是“init”进程,从而保护子进程被杀死。


5
投票

如我错了请纠正我

  nohup myprocess.out &

nohup捕获挂断信号,这意味着它将在终端关闭时发送进程。

 myprocess.out &

进程可以运行,但一旦终端关闭就会停止。

nohup myprocess.out

能够运行甚至终端关闭的过程,但您可以通过在终端中按ctrl + z来停止该过程。如果Crt存在,z + &无效。


1
投票

nohup命令是信号屏蔽实用程序并捕获挂起信号。而且&符号没有捕捉挂起信号。当使用&退出shell运行命令时,shell将使用挂起信号终止子命令。这可以通过使用nohup来防止,因为它捕获信号。 Nohup命令接受挂起信号,该信号可以由内核发送到进程并阻止它们。当用户想要启动长时间运行的应用程序注销或关闭启动进程的窗口时,Nohup命令很有用。这些操作中的任何一个通常都会提示内核挂起应用程序,但nohup包装器将允许该进程继续。使用&符号将在子进程和当前bash会话的这个子进程中运行该命令。退出会话时,将终止该进程的所有子进程。 &符号与活动shell的作业控制有关。这对于在后台运行会话中的过程非常有用。

© www.soinside.com 2019 - 2024. All rights reserved.