nohup myprocess.out &
myprocess.out &
nohup捕获了挂断信号(参见man 7 signal),而&号没有(除非shell以这种方式配置或根本不发送SIGHUP)。
nohup
man 7 signal
SIGHUP
通常,当使用&运行命令并退出shell时,shell将用挂断信号(kill -SIGHUP <pid>)终止子命令。这可以使用nohup来防止,因为它捕获信号并忽略它,因此它永远不会到达实际应用程序。
&
kill -SIGHUP <pid>
shopt | grep hupon
myprocess.out &将使用子shell在后台运行进程。如果当前shell被终止(例如注销),所有子shell也将被终止,因此后台进程也将被终止。nohup命令忽略HUP信号,因此即使当前shell被终止,子shell和myprocess.out将继续在后台运行。另一个区别是&本身并不重定向stdout/stderr,因此如果有任何输出或错误,它们将显示在终端上。nohup将stdout/stderr重定向到nohup.out或$HOME/nohup.out。
HUP
myprocess.out
nohup.out
$HOME/nohup.out
使用&号(&)将在子进程(当前bash会话的子进程)中运行该命令。但是,当您退出会话时,所有子进程将被杀死。
使用nohup + &号(&)将完成同样的事情,除了会话结束时,子进程的父进程将被更改为“1”,即“init”进程,从而保护子进程不被杀死。
Nohup command name & eg: nohup sh script.sh &
Nohup接收HUP信号。 Nohup不会自动把工作放在后台。我们需要显式地使用&
nohup命令是一个信号屏蔽实用程序,用于捕捉挂机信号。这里的&不能捕捉到挂机信号。当运行一个使用&然后脱离壳层。这可以通过使用nohup来防止,因为它可以捕获信号。Nohup命令接受挂起信号,内核可以向进程发送挂起信号并阻止进程挂起。当用户希望启动长时间运行的应用程序时,Nohup命令非常有用,可以注销或关闭启动进程的窗口。这两种操作通常都会提示内核挂起应用程序,但是nohup包装器将允许该进程继续。 使用&号将在子进程和当前bash会话的子进程中运行该命令。当您退出会话时,该进程的所有子进程将被杀死。&与活动shell的作业控制有关。这对于在后台的会话中运行进程非常有用
如果我说错了,请指正
nohup捕获挂起信号,这意味着它将在终端关闭时发送一个进程。
进程可以运行,但是一旦终端关闭,进程就会停止。
nohup myprocess.out
即使终端关闭,进程也能运行,但你可以在终端中按ctrl + z来停止进程。如果&存在,Crt +z不工作。
ctrl
z
Crt
在很多情况下,环境之间的微小差异会让你大吃一惊。这是我最近遇到的一个问题。这两个命令有什么区别?
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作为启动方法添加到第二个脚本之后,即使脚本将退出,应用程序也会继续运行,并且这种行为在两个环境中都是一致的。