这是我对&
,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
to之外nohup.out
,在我看来它可以被认为完全等同于<command> & disown
.
以上都对吗?有什么误解吗?
你的理解基本正确。
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
),但它们的基本功能是相同的,是的。要更详细地讨论这些工具以及它们之间的区别,请查看此处的答案:
disown -h
和nohup
工作效率一样吗?您的第一点到第三点似乎没问题,尽管
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> &
.