nohup和&符号之间有什么区别

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信号的过程时,就像这里的情况一样.

  • 值得注意的是,仅“&amp;”确实会导致子命令无法接收某些信号(例如 SIGINT)。`nohup` 本质上是将 `SIGHUP` 添加到未传播的信号列表中。 (2认同)

ami*_*t_g 37

myprocess.out &将使用子shell在后台运行该过程.如果当前shell终止(例如通过注销),则所有子shell也将终止,因此后台进程也将终止.的nohup的命令忽略HUP信号,因此,即使当前壳被终止,子外壳和所述myprocess.out将继续在后台运行.另一个区别是&单独不重定向stdout/stderr,所以如果有任何输出或错误,那么它们会显示在终端上.另一方面,nohup将stdout/stderr重定向到nohup.out或$ HOME/nohup.out.

  • 我运行`myprocess.out&`并退出shell.但是,当我使用`ps aux | 在其他shell中grep myprocess.out`,我仍然可以找到"myprocess.out".这意味着该进程仍在运行,不会被终止. (4认同)
  • @amit_g 当使用“kill -9”杀死父 shell 时,不会出现 SIGHUP,因为这需要父 shell 处理 SIGKILL,但它不能。 (2认同)
  • 检查shopt | grep hupon在另一个答案中提到. (2认同)

小智 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


Dev*_*yal 6

在很多情况下,环境之间的微小差异都会给你带来困扰。这是我最近遇到的一个。这两个命令有什么区别?

\n\n
1 ~ $ nohup myprocess.out &\n2 ~ $ myprocess.out &\n
Run Code Online (Sandbox Code Playgroud)\n\n

答案和平常一样——这取决于情况。

\n\n

nohup 捕获挂断信号,而 & 符号则不捕获。

\n\n

挂断信号是什么?

\n\n

SIGHUP - 在控制终端上检测到挂起或控制进程死亡(值: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\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

在所描述的情况下,当在自定义服务启动脚本内调用第二个脚本时,缺乏差异让我感到困扰,该脚本无需 nohup 命令即可设置并启动正确的应用程序。

\n\n

在一个 Linux 环境中,一切运行顺利,在第二个环境中,应用程序在第二个脚本退出后立即退出(检测到这种情况,当然花了我比你想象的更多的时间:stuck_out_tongue:)。

\n\n

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

\n


Joh*_*Joe 5

如果我错了纠正我

  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+ 来停止进程zCrt+ z如果&存在则无法正常工作。