it-swarm.cn

Nohup,disown和&之间的区别

之间有什么区别

$ Nohup foo

$ foo &

$ foo & 
$ disown
600
lesmana

首先,让我们看看如果从交互式Shell(连接到终端)启动程序而没有&(并且没有任何重定向)时会发生什么情况。因此,假设您刚刚输入了foo

  • 创建运行foo的进程。
  • 该进程从Shell继承了stdin,stdout和stderr。因此,它也连接到同一端子。
  • 如果命令行管理程序收到一个SIGHUP,它还将向该进程发送一个SIGHUP(通常会导致该进程终止)。
  • 否则,命令行管理程序将等待(被阻止)直到进程终止。

现在,让我们看看如果将流程放在后台,即键入foo &,会发生什么:

  • 创建运行foo的进程。
  • 该进程从Shell继承了stdout/stderr(因此它仍会写入终端)。
  • 原则上,该进程也继承stdin,但是一旦尝试从stdin中读取,它就会被暂停。
  • 它被放入Shell管理的后台作业列表中,这尤其意味着:
    • 它以jobs列出,并且可以使用%n(其中n是作业编号)进行访问。
    • 可以使用fg将其转换为前台作业,在这种情况下,它将继续进行,就好像您没有在其上使用&一样(如果由于尝试从标准输入中读取而被停止,则现在可以继续执行以下操作:从终端读取)。
    • 如果命令行管理程序收到一个SIGHUP,它也会向该进程发送一个SIGHUP。根据命令行管理程序以及可能为命令行管理程序设置的选项,终止命令行管理程序时,它还将向进程发送SIGHUP

现在disown将从Shell的作业列表中删除该作业,因此上面的所有子点不再适用(包括Shell向SIGHUP发送的过程)。但是请注意,它 still 已连接到终端,因此如果终端被破坏(如果是pty,则可能会发生这种情况,例如xtermssh和控制程序创建的终端)通过关闭xterm或终止 [~~~ ssh [〜#〜] 连接)来终止程序,该程序将在尝试从标准输入读取或写入标准输出时立即失败。

另一方面,Nohup的作用是有效地将过程与终端分开:

  • 它关闭标准输入(即使在前台运行,程序也将 not 能够读取任何输入。它不会暂停,但会收到错误代码或EOF) 。
  • 它将标准输出和标准错误重定向到文件Nohup.out,因此,如果终端发生故障,程序将不会失败地写入标准输出,因此不会丢失任何过程写入的内容。
  • 它防止进程接收SIGHUP(因此是名称)。

请注意,Nohup不会 not 从命令行管理程序的作业控件中删除该进程,也不会将其置于后台(但由于前台Nohup作业或多或少没有用,因此您会通常使用&将其置于背景中。例如,与disown不同,命令行管理程序仍会告诉您Nohup作业何时完成(当然,除非命令行管理程序在此之前终止)。

总结一下:

  • &将作业放在后台,也就是说,使其在尝试读取输入时阻塞,并使Shell不等待其完成。
  • disown从Shell的作业控件中删除了该进程,但仍将其连接到终端。结果之一是,命令行管理程序不会向其发送SIGHUP。显然,它只能应用于后台作业,因为在前台作业运行时无法输入它。
  • Nohup断开进程与终端的连接,将其输出重定向到Nohup.out并将其与SIGHUP隔离。效果之一(命名之一)是该进程将不会收到任何已发送的SIGHUP。它完全独立于作业控制,并且原则上也可以用于前台作业(尽管这不是很有用)。
595
celtschk

使用&导致程序在后台运行,因此您将获得一个新的Shell Prompt(而不是阻塞),直到程序结束。 Nohupdisown基本上无关;它们抑制SIGHUP(挂断)信号,因此在控制终端关闭时不会自动终止程序。 Nohup在作业首次开始时执行此操作。如果开始时没有Nohup个作业,则可以使用disown来修改正在运行的作业;不带参数的情况下,它会修改当前的工作,这是刚刚被后台处理的工作

174
Michael Mrozek

这是我的经验,我试图在使用非终止命令(例如tail)后在后台运行办公室。在此示例中,我将使用sleep 100

#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100

请参阅即席日志 /通过按-​​Ctrl--C 办公室停止

Nohup ..&

#!/bin/bash
Nohup /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100

看不见即席日志 /通过按 Ctrl--C 办公室停止

和放弃

#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard & disown
sleep 100

请参阅即席日志 /通过按-​​Ctrl--C 办公室停止

setid ..&

#!/bin/bash
setsid /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100

请参阅即席日志 /通过按 Ctrl--C 办公室不停止

为了节省空间:
Nohup setsid ..:不显示日志/办公室不停止 Ctrl--C
Nohup& disown结尾:不显示日志/ 办公室停在 Ctrl--C

9
Marinos An