【问题标题】:What's the difference between nohup and ampersandnohup 和 & 和有什么区别
【发布时间】:2013-03-13 18:53:35
【问题描述】:

nohup myprocess.out &myprocess.out & 都将 myprocess.out 设置为在后台运行。关闭终端后,该过程仍在运行。 它们有什么区别?

【问题讨论】:

  • 你用的是什么外壳?行为因外壳而异
  • 重击。我知道为什么现在根据@nemo 的回答。
  • @Yarkee 如果答案适合您的问题,请将问题标记为已接受(答案投票下方的复选框),这样它就不会悬而未决。您应该对所有问题都这样做:)
  • shutdown 应避免作为具有特定 Linux 含义的术语。而应替换为 exit

标签: linux bash nohup


【解决方案1】:

nohup 捕获挂断信号(请参阅 man 7 signal),而与号没有(除非 shell 以这种方式配置或根本不发送 SIGHUP)。

通常,当使用& 运行命令并随后退出shell 时,shell 将使用挂断信号(kill -SIGHUP <pid>)终止子命令。这可以使用nohup 来防止,因为它会捕获信号并忽略它,因此它永远不会到达实际应用程序。

如果你使用 bash,你可以使用命令shopt | grep hupon 来查看是否 您的 shell 是否将 SIGHUP 发送到其子进程。如果它关闭,进程将不会 终止,因为它似乎是你的情况。有关 bash 如何终止的更多信息 可以在here找到申请。

在某些情况下nohup 不起作用,例如当您启动的进程重新连接时 SIGHUP 信号,就像here 一样。

【讨论】:

  • 值得注意的是,& 确实会导致子命令无法接收某些信号(例如 SIGINT)。 nohup 实质上将SIGHUP 添加到未传播的信号列表中。
【解决方案2】:

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

【讨论】:

  • 我运行myprocess.out & 并退出shell。但是,当我在其他 shell 中使用ps aux | grep myprocess.out 时,我仍然可以找到“myprocess.out”。这意味着该进程仍在运行,而不是被终止。
  • @amit_g 当使用kill -9 杀死父shell 时,不会有SIGHUP,因为这需要父shell 处理SIGKILL,而它不能。
  • 检查商店 | grep hupon 如另一个答案中所述。
【解决方案3】:

使用与号 (&) 将在子进程(当前 bash 会话的子进程)中运行命令。但是,当您退出会话时,所有子进程都将被杀死。

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

【讨论】:

  • 正如下面@Devender 的回答中所指出的,如果 huponexit 设置为 'on',这仅在 bash 终端中是正确的
【解决方案4】:

大多数时候我们使用 ssh 登录到远程服务器。如果您启动 shell 脚本并注销,则该进程将被终止。 即使您从 shell 注销后,Nohup 也有助于继续在后台运行脚本。

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

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

【讨论】:

  • 谢谢。没想到你的回答,但它在这里的事实很棒。它回答了我没有问的问题:D
【解决方案5】:

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

【讨论】:

    【解决方案6】:

    如有错误请指正

      nohup myprocess.out &
    

    nohup 捕获挂断信号,这意味着它会在终端关闭时发送一个进程。

     myprocess.out &
    

    进程可以运行,但一旦终端关闭就会停止。

    nohup myprocess.out
    

    即使终端关闭,进程也能运行,但您可以通过在终端中按 ctrl + z 来停止进程。如果& 存在,Crt +z 不起作用。

    【讨论】:

    • 技术上 ctrl Z 只是暂停进程 - 您可以使用 bg(背景)或 fg(前景)恢复进程。 'stop' 可能会有一些混淆,因为它可能被解释为进程无法恢复。
    【解决方案7】:

    在很多情况下,环境之间的微小差异可能会影响您。这是我最近遇到的一个。这两个命令有什么区别?

    1 ~ $ nohup myprocess.out &
    2 ~ $ myprocess.out &
    

    答案和往常一样——视情况而定。

    nohup 捕获挂断信号,而 & 符号没有。

    什么是挂断信号?

    SIGHUP - 在控制终端上检测到挂起或控制进程死亡(值:1)。

    通常,当使用 & 运行命令并随后退出 shell 时,shell 将使用 hangup 信号终止子命令(如 kill -SIGHUP $PID)。这可以使用 nohup 来防止,因为它会捕获信号并忽略它,因此它永远不会到达实际的应用程序。

    很好,但就像在这种情况下,总是有“但是”。当 shell 配置为根本不发送 SIGHUP 时,这些启动方法之间没有区别。

    如果您使用的是 bash,您可以使用下面指定的命令来确定您的 shell 是否向其子进程发送 SIGHUP:

    ~ $ shopt | grep hupon
    

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

    在所描述的情况下,在自定义服务启动脚本中调用第二个脚本来设置和启动正确的应用程序而不使用 nohup 命令时,缺乏差异让我感到困惑。

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

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

    【讨论】:

      猜你喜欢
      • 2016-12-11
      • 1970-01-01
      • 2010-10-31
      • 2010-10-02
      • 2011-12-12
      • 2010-09-16
      • 2012-03-14
      • 2012-02-06
      • 2011-02-25
      相关资源
      最近更新 更多