“&disown”和“nohup &disown”之间的差异
这是我对&
, disown
和nohup
的使用的理解:
-
:在终端的当前
bash
实例中, 在前台运行进程(即进程被列为bash
前台作业,stdin
,stdout
和stderr
仍然绑定到终端 ); 不能免于挂断 ; -
&
: 在后台的终端当前bash
实例中运行进程(即进程被列为bash
后台作业,stdin
,stdout
和stderr
仍然绑定到终端 ); 不能免于挂断 ; -
& disown
: 在后台运行终端当前bash
实例中的进程,但该进程与bash
的jobs列表分离 (即该进程未列为bash
前台/后台作业和stdin
,stdout
和stderr
仍然绑定到终端 ); 免于挂断 ; -
nohup & disown
: 在后台运行终端当前bash
实例中的进程,但是该进程与bash
的jobs列表分离 (即该进程未被列为bash
前台/后台作业和stdin
,stdout
和stderr
还没有 绑定到终端 ); 免于挂断 ;
因此,除了nohup & disown
阻塞stdin
并默认将stdout
和stderr
重定向到nohup.out
,在我看来它可以被认为完全等同于 & disown
。
以上都是正确的吗? 有什么误解吗?
你的理解基本上是正确的。 disown
和nohup
都用于允许您退出正在运行的shell会话而不停止正在运行的作业。 一些澄清:
-
没有理由运行
nohup command & disown
,nohup
已经为你取消了它。 -
nohup
由POSIX定义,而disown
定义 。 这意味着虽然许多shell(例如bash
,zsh
,ksh
)拥有它,但其他shell(例如tcsh
,csh
,dash
和sh
)将不具备它。 -
在启动命令后可以使用
disown
而之前必须使用nohup
。
据我所知,这两个命令的实际效果是一样的。 他们每个都有其他缺乏的function(见help disown
和man 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
,当使用nohup
或disown
的任何一个时,不需要另一个。 它们的目的是相同的(忽略SIGHUP
)但它们的function有点不同。 因此命令可以简化为nohup
。