“ <command>&disown”和“ nohup <command>&disown”之间的区别


41

这是我讲的用法的理解&disown以及nohup

  • <command>:在终端的当前bash实例中,在前台运行该进程(即,该进程被列为bash前台作业stdinstdout并且stderr仍然绑定到终端);无法摆脱挂断 ;
  • <command> &:在终端的当前bash实例中在后台运行该进程(即该进程被列为bash后台作业和stdinstdout并且stderr绑定到终端);无法摆脱挂断 ;
  • <command> & disown在后台在终端的当前bash实例中运行进程,但是该进程“作业”列表分离(即,该进程未列为前台/后台作业,并且仍绑定到终端);不受挂断的影响 ;bashbashstdinstdoutstderr
  • nohup <command> & disown:运行终端当前的内部流程bash实例,在后台,但过程是从分离bash的职位名单(即过程没有列为bash前台/后台作业和stdinstdoutstderr不是仍然绑定到终端) ; 不受挂断的影响 ;

因此,除了nohup <command> & disown阻止stdin和重定向stdoutstderrnohup.out默认状态下,它似乎对我来说,它可以被认为完全等同<command> & disown

以上是正确的吗?有误解吗?


1
“不受挂断”和“不受挂断”是什么意思?
混乱

2
@chaos我的意思是终止/杀父bash实例不会终止进程
科斯

Answers:


32

您的理解基本上是正确的。这两个disownnohup使用,让您无需停止运行的作业退出正在运行的shell会话。一些说明:

  • 没有理由要运行nohup command & disownnohup已经为您取消了运行。

  • nohup由POSIX定义disown 不是。这意味着,虽然许多炮弹(例如bashzshksh)有它,其他人(例如tcshcshdashsh)将不会拥有它。

  • disown可以命令启动使用nohup必须先使用。

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

要对这些工具及其之间的区别进行更详细的讨论,请在此处查看答案:


11
Nohup并且disown不是同一件事,并且同时使用这两个命令不是多余的。有关详细说明,请参见此答案
备忘录

7

您的第一点至第三点看起来不错,尽管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,而使用中的任何一个nohupdisown不需要另一个。它们的目的是相同的(忽略SIGHUP),但是它们的功能略有不同。因此,该命令可以简化为nohup <command> &

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.