nohup和&符有什么区别?

nohup myprocess.out &myprocess.out &设置myprocess.out在后台运行。 在closuresterminal之后,该过程仍在运行。 他们之间有什么区别?

nohup捕捉到挂断信号(见man 7 signal ),而&符号(除了shell是这样configuration的,或者根本不发送SIGHUP )。

通常情况下,当使用&运行一个命令&然后退出shell时,shell会用挂断信号终止子命令( kill -SIGHUP <pid> )。 这可以使用nohup来阻止,因为它捕获信号并忽略它,以至于它永远达不到实际应用。

如果你使用bash,你可以使用命令shopt | grep hupon shopt | grep hupon来找出你的shell是否发送SIGHUP给它的subprocess。 如果它closures,进程不会被终止,因为它似乎是你的情况。 有关bash如何终止应用程序的更多信息可以在这里find。

在某些情况下, nohup不起作用,例如,当您开始重新连接SIGHUP信号时,就像在这里一样 。

myprocess.out &会使用子shell在后台运行进程。 如果当前shell被终止(例如通过注销),所有的子shell也被终止,所以后台进程也将被终止。 nohup命令会忽略HUP信号,因此即使当前shell被终止,subshel​​l和myprocess.out也会继续在后台运行。 另一个区别是&独立不redirectstdout / stderr,所以如果有任何输出或错误,这些都显示在terminal上。 nohup另一方面将stdout / stderrredirect到nohup.out或$ HOME / nohup.out。

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

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

大多数情况下,我们使用sshlogin到远程服务器。 如果你启动一个shell脚本并注销,那么这个进程将被终止。 即使从shell注销,Nohup也可以帮助继续在后台运行脚本。

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

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

如我错了请纠正我

  nohup myprocess.out & 

nohup捕捉到挂断信号,这意味着它将在terminalclosures时发送一个进程。

  myprocess.out & 

进程可以运行,但terminalclosures后会停止。

 nohup myprocess.out 

进程能够运行甚至terminalclosures,但您可以通过在terminal按ctrl + z停止进程。 如果&存在&Crt + z不工作。

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