Yar*_*kee 222 linux bash nohup
两者nohup myprocess.out &或myprocess.out &将myprocess.out设置为在后台运行.关闭终端后,进程仍在运行.他们之间有什么区别?
nem*_*emo 293
nohup捕获挂断信号(请参阅man 7 signal),而&符号没有(除了shell以这种方式配置或根本不发送SIGHUP).
通常,在运行命令后使用&和退出shell时,shell将使用hangup signal(kill -SIGHUP <pid>)终止子命令.这可以使用nohup,因为它捕获信号并忽略它,以便它永远不会到达实际的应用程序.
如果您正在使用bash,则可以使用该命令shopt | grep hupon查明您的shell是否将SIGHUP发送到其子进程.如果它关闭,进程将不会终止,因为您似乎就是这种情况.有关bash如何终止应用程序的更多信息,请参见此处.
有些情况nohup不起作用,例如当您开始重新连接SIGHUP信号的过程时,就像这里的情况一样.
ami*_*t_g 37
myprocess.out &将使用子shell在后台运行该过程.如果当前shell终止(例如通过注销),则所有子shell也将终止,因此后台进程也将终止.的nohup的命令忽略HUP信号,因此,即使当前壳被终止,子外壳和所述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 &
Run Code Online (Sandbox Code Playgroud)
Nohup捕获了HUP信号.Nohup不会自动将作业放在后台.我们需要告诉明确使用&
小智 22
使用&符号(&)将在子进程中运行该命令(子进程到当前的bash会话).但是,退出会话时,将终止所有子进程.
使用nohup +&符号(&)将执行相同的操作,除了当会话结束时,子进程的父进程将更改为"1",这是"init"进程,从而保护子进程被杀死.
小智 6
nohup 命令是一个信号屏蔽实用程序,可捕获挂断信号。其中 & 符号不\xe2\x80\x99t 捕获挂断信号。当使用 & 运行命令并退出 shell 时,shell 将使用挂断信号终止子命令。这可以通过使用 nohup 来防止,因为它捕获信号。Nohup 命令接受挂起信号,该信号可以由内核发送到进程并阻止它们。当用户想要启动长时间运行的应用程序时,Nohup 命令非常有用,注销或关闭启动进程的窗口。这些操作中的任何一个通常都会提示内核挂起应用程序,但 nohup 包装器将允许进程继续。\n使用 & 符号将在子进程和当前 bash 会话的子进程中运行该命令。当您退出会话时,该进程的所有子进程都将被终止。& 符号与活动 shell 的作业控制相关。这对于在后台运行会话中的进程很有用。
\n在很多情况下,环境之间的微小差异都会给你带来困扰。这是我最近遇到的一个。这两个命令有什么区别?
\n\n1 ~ $ nohup myprocess.out &\n2 ~ $ myprocess.out &\nRun Code Online (Sandbox Code Playgroud)\n\n答案和平常一样——这取决于情况。
\n\nnohup 捕获挂断信号,而 & 符号则不捕获。
\n\n挂断信号是什么?
\n\nSIGHUP - 在控制终端上检测到挂起或控制进程死亡(值:1)。
\n\n通常,当使用 & 运行命令并随后退出 shell 时,shell 会使用挂起信号(如kill -SIGHUP $PID)终止子命令。可以使用 nohup 来防止这种情况,因为它捕获信号并忽略它,因此它永远不会到达实际应用程序。
\n\n很好,但就像在这种情况下总是有 \xe2\x80\x98buts\xe2\x80\x99。当 shell 配置为根本不发送 SIGHUP 时,这些启动方法之间没有区别。
\n\n如果您使用的是 bash,您可以使用下面指定的命令来查明您的 shell 是否向其子进程发送 SIGHUP:
\n\n~ $ shopt | grep hupon\nRun Code Online (Sandbox Code Playgroud)\n\n而且 - 在某些情况下 nohup 不起作用。例如,当您启动的进程重新连接 NOHUP 信号时(它是在应用程序代码级别的内部完成的)。
\n\n在所描述的情况下,当在自定义服务启动脚本内调用第二个脚本时,缺乏差异让我感到困扰,该脚本无需 nohup 命令即可设置并启动正确的应用程序。
\n\n在一个 Linux 环境中,一切运行顺利,在第二个环境中,应用程序在第二个脚本退出后立即退出(检测到这种情况,当然花了我比你想象的更多的时间:stuck_out_tongue:)。
\n\n将 nohup 作为启动方法添加到第二个脚本后,即使脚本将退出,应用程序也会继续运行,并且此行为在两个环境中变得一致。
\n如果我错了纠正我
nohup myprocess.out &
Run Code Online (Sandbox Code Playgroud)
nohup捕获挂断信号,这意味着当终端关闭时它将发送一个进程。
myprocess.out &
Run Code Online (Sandbox Code Playgroud)
进程可以运行,但是一旦关闭终端就会停止。
nohup myprocess.out
Run Code Online (Sandbox Code Playgroud)
即使关闭了终端,进程也可以运行,但是您可以通过在终端中按ctrl+ 来停止进程z。Crt+ z如果&存在则无法正常工作。