&
这是我对、disown
和的用法的理解nohup
:
<command>
:在终端的当前bash
实例中运行该进程,在前景中(即该进程被列为bash
前台作业stdin
,stdout
并且 和stderr
仍然绑定到终端(英文):无法避免挂断;<command> &
:在终端的当前bash
实例中运行该进程,在背景中(即该过程被列为bash
后台作业,并且stdin
,stdout
并且stderr
仍然绑定到终端(英文):无法避免挂断;<command> & disown
:在终端的当前bash
实例中运行该进程,在背景中,但过程是从bash
“工作”列表中分离出来(即该进程未被列为bash
前台/后台作业,并且stdin
,stdout
和stderr
仍然绑定到终端(英文):不受挂断影响;nohup <command> & disown
:在终端的当前bash
实例中运行该进程,在背景中,但过程是从bash
“工作”列表中分离出来(即该进程未列为bash
前台/后台作业,并且stdin
,stdout
和stderr
是不是仍然绑定到终端(英文):不受挂断影响;
因此,除了默认情况下nohup <command> & disown
阻止stdin
和重定向之外stdout
,在我看来它可以被认为完全等同于。stderr
nohup.out
<command> & disown
以上内容正确吗?有任何误解吗?
答案1
您的理解基本正确。disown
和nohup
都用于允许您退出正在运行的 shell 会话而不停止正在运行的作业。 一些说明:
没有必要逃跑
nohup command & disown
,nohup
已经替你否认了。nohup
是由 POSIX 定义尽管disown
不是。这意味着虽然许多 shell(例如bash
、zsh
、 )拥有它,但ksh
其他 shell(例如tcsh
、csh
和)却没有它。dash
sh
disown
可以使用后命令已启动,但nohup
必须在之前使用。
据我所知,这两个命令的实际效果是一样的。它们各自具有对方所没有的功能(请参阅help disown
和man 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
任何一个都是不必要的。它们的用途相同(忽略),但它们的功能略有不同。因此,该命令可以简化为。nohup
disown
SIGHUP
nohup <command> &