nohup和&号有什么区别

nohup myprocess.out &myprocess.out &都设置了myprocess。在后台运行。关闭终端后,进程仍在运行。 它们之间有什么区别?< / p >
195123 次浏览

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

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

如果你正在使用bash,你可以使用命令shopt | grep hupon来找出是否 你的shell是否发送SIGHUP给它的子进程。如果它是关闭的,进程将不会 终止了,就像你的情况一样。关于bash如何终止的更多信息 应用程序可以找到在这里.

在某些情况下,nohup不工作,例如当您启动的进程重新连接时 SIGHUP信号,因为它是在这里.

myprocess.out &将使用子shell在后台运行进程。如果当前shell被终止(例如注销),所有子shell也将被终止,因此后台进程也将被终止。nohup命令忽略HUP信号,因此即使当前shell被终止,子shell和myprocess.out将继续在后台运行。另一个区别是&本身并不重定向stdout/stderr,因此如果有任何输出或错误,它们将显示在终端上。nohup将stdout/stderr重定向到nohup.out$HOME/nohup.out

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

使用nohup + &号(&)将完成同样的事情,除了会话结束时,子进程的父进程将被更改为“1”,即“init”进程,从而保护子进程不被杀死。

大多数时候我们使用ssh登录远程服务器。如果你启动一个shell脚本,然后注销,那么这个进程就会被杀死。

. Nohup帮助在退出shell后继续在后台运行脚本
Nohup command name &
eg: nohup sh script.sh &

Nohup接收HUP信号。 Nohup不会自动把工作放在后台。我们需要显式地使用&

来告诉它

nohup命令是一个信号屏蔽实用程序,用于捕捉挂机信号。这里的&不能捕捉到挂机信号。当运行一个使用&然后脱离壳层。这可以通过使用nohup来防止,因为它可以捕获信号。Nohup命令接受挂起信号,内核可以向进程发送挂起信号并阻止进程挂起。当用户希望启动长时间运行的应用程序时,Nohup命令非常有用,可以注销或关闭启动进程的窗口。这两种操作通常都会提示内核挂起应用程序,但是nohup包装器将允许该进程继续。 使用&号将在子进程和当前bash会话的子进程中运行该命令。当您退出会话时,该进程的所有子进程将被杀死。&与活动shell的作业控制有关。这对于在后台的会话中运行进程非常有用

如果我说错了,请指正

  nohup myprocess.out &

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

 myprocess.out &

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

nohup myprocess.out

即使终端关闭,进程也能运行,但你可以在终端中按ctrl + z来停止进程。如果&存在,Crt +z不工作。

在很多情况下,环境之间的微小差异会让你大吃一惊。这是我最近遇到的一个问题。这两个命令有什么区别?

1 ~ $ nohup myprocess.out &
2 ~ $ myprocess.out &

答案和往常一样——视情况而定。

Nohup捕获挂机信号,而&号则没有。

挂机信号是什么?

SIGHUP -在控制终端上检测到挂起或控制进程死亡(值:1)。

通常,当使用&运行命令时;然后退出shell, shell将用挂断信号终止子命令(如kill -SIGHUP $PID)。可以使用nohup来防止这种情况,因为它捕获信号并忽略它,因此它永远不会到达实际应用程序。

好吧,但就像在这种情况下总是有“但是”。当shell配置为完全不发送SIGHUP时,这些启动方法之间没有区别。

如果你正在使用bash,你可以使用下面指定的命令来查看你的shell是否将SIGHUP发送给它的子进程:

~ $ shopt | grep hupon

此外,在某些情况下nohup不起作用。例如,当您启动的进程重新连接NOHUP信号时(这是在应用程序代码级别内部完成的)。

在上述案例中,在自定义服务启动脚本中,由于缺少差异,在没有nohup命令的情况下调用了第二个脚本来设置和启动适当的应用程序。

在一个Linux环境中,一切都很顺利,而在另一个环境中,当第二个脚本退出时,应用程序就退出了(检测这种情况,当然花费了我更多的时间,你可能会认为:stuck_out_tongue:)。

在将nohup作为启动方法添加到第二个脚本之后,即使脚本将退出,应用程序也会继续运行,并且这种行为在两个环境中都是一致的。