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被终止,subshell和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的作业控制有关。 这对于在后台运行会话中的进程很有用。