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

这是我对&disownnohup的使用的理解:

  • :在终端的当前bash实例中, 在前台运行进程(即进程被列为bash前台作业, stdinstdoutstderr仍然绑定到终端 ); 不能免于挂断 ;
  • &在后台的终端当前bash实例中运行进程(即进程被列为bash后台作业, stdinstdoutstderr仍然绑定到终端 ); 不能免于挂断 ;
  • & disown在后台运行终端当前bash实例中的进程,但该进程bash的jobs列表分离 (即该进程未列为bash前台/后台作业和stdinstdoutstderr仍然绑定到终端 ); 免于挂断 ;
  • nohup & disown在后台运行终端当前bash实例中的进程,但是该进程bash的jobs列表分离 (即该进程未被列为bash前台/后台作业和stdinstdoutstderr没有 绑定到终端 ); 免于挂断 ;

因此,除了nohup & disown阻塞stdin并默认将stdoutstderr重定向到nohup.out ,在我看来它可以被认为完全等同于 & disown

以上都是正确的吗? 有什么误解吗?

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

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

  • nohup 由POSIX定义,而disown 定义 。 这意味着虽然许多shell(例如bashzshksh )拥有它,但其他shell(例如tcshcshdashsh )将不具备它。

  • 在启动命令可以使用disown而之前必须使用nohup

据我所知,这两个命令的实际效果是一样的。 他们每个都有其他缺乏的function(见help disownman nohup ),但他们的基本function是相同的,是的。

你的第一点到第三点似乎没问题,虽然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在第四点stdin, stdout and stderr are not still bound to the terminal ,这在我前面的段落中提到的不正确。 此外,您还使用/dev/null作为command的输入文件,例如,如果命令是cat ,则将其用作cat /dev/null

你的第五点上的命令没有正确放置,你使用nohup & disown ,当使用nohupdisown的任何一个时,不需要另一个。 它们的目的是相同的(忽略SIGHUP )但它们的function有点不同。 因此命令可以简化为nohup &