之间的差异 ”& disown”和“nohup”& 否认”

之间的差异 ”& disown”和“nohup”& 否认”

&这是我对、disown和的用法的理解nohup

  • <command>:在终端的当前bash实例中运行该进程,在前景中(即该进程被列为bash前台作业stdinstdout并且 和stderr仍然绑定到终端(英文):无法避免挂断
  • <command> &:在终端的当前bash实例中运行该进程,在背景中(即该过程被列为bash后台作业,并且stdinstdout并且stderr仍然绑定到终端(英文):无法避免挂断
  • <command> & disown:在终端的当前bash实例中运行该进程,在背景中,但过程是bash“工作”列表中分离出来(即该进程未被列为bash前台/后台作业,并且stdinstdoutstderr仍然绑定到终端(英文):不受挂断影响
  • nohup <command> & disown:在终端的当前bash实例中运行该进程,在背景中,但过程是bash“工作”列表中分离出来(即该进程未列为bash前台/后台作业,并且stdinstdoutstderr不是仍然绑定到终端(英文):不受挂断影响

因此,除了默认情况下nohup <command> & disown阻止stdin和重定向之外stdout,在我看来它可以被认为完全等同于。stderrnohup.out<command> & disown

以上内容正确吗?有任何误解吗?

答案1

您的理解基本正确。disownnohup都用于允许您退出正在运行的 shell 会话而不停止正在运行的作业。 一些说明:

  • 没有必要逃跑nohup command & disownnohup已经替你否认了。

  • nohup由 POSIX 定义尽管disown 不是。这意味着虽然许多 shell(例如bashzsh、 )拥有它,但ksh其他 shell(例如tcshcsh和)却没有它。dashsh

  • disown可以使用命令已启动,但nohup必须在之前使用。

据我所知,这两个命令的实际效果是一样的。它们各自具有对方所没有的功能(请参阅help disownman nohup),但它们的基本功能是相同的,是的。

有关这些工具及其之间差异的更详细讨论,请查看以下答案:

答案2

您的第一到第三点似乎没有问题,尽管stdin, stdout and stderr are still bound to the terminal这不是一个正确的概念。stdin始终绑定到终端,即您始终通过终端或使用终端的方式将文件名输入到命令中。stdout and stderr are still bound to the terminal是可以的。

stdin, stdout and stderr are not still bound to the terminal第四点不对,正如我在上一段中提到的。此外,您在此处使用为/dev/null输入文件command,例如,如果命令是cat,则您将其用作cat /dev/null

第 5 点中的命令不正确,您使用了,而使用或中的nohup <command> & disown任何一个都是不必要的。它们的用途相同(忽略),但它们的功能略有不同。因此,该命令可以简化为。nohupdisownSIGHUPnohup <command> &

相关内容