问题描述
这是我对&
,disown
和nohup
的用法的理解:
-
<command>
:在终端的当前bash
实例中在前台运行该进程(即该进程被列为bash
前台作业,并且stdin
,stdout
和stderr
仍绑定到该终端);无法避免挂断; -
<command> &
:在后台在终端的当前bash
实例中运行该进程(即该进程被列为bash
后台作业,并且stdin
,stdout
和stderr
仍绑定到该终端);无法避免挂断; -
<command> & disown
:在后台在终端的当前bash
实例中运行该进程,但是该进程与bash
‘s jobs’列表分离(即该进程未列为bash
前台/后台作业,并且stdin
,stdout
和stderr
仍绑定到该进程终点站);不受挂断的困扰; -
nohup <command> & disown
:在后台在终端的当前bash
实例中运行该进程,但该进程与bash
‘s jobs’列表分离(即该进程未列为bash
前台/后台作业,并且stdin
,stdout
和stderr
仍未绑定到终端);免于挂断;
因此,除了nohup <command> & disown
阻止stdin
并默认将stdout
和stderr
重定向到nohup.out
之外,在我看来,它似乎可以完全等同于<command> & disown
。
以上是正确的吗?有误解吗?
最佳思路
您的理解基本上是正确的。 disown
和nohup
均用于允许您退出正在运行的Shell会话而无需停止正在运行的作业。一些说明:
-
没有理由运行
nohup command & disown
,nohup
已经为您取消了它。 -
nohup
是defined by POSIX而disown
is not是。这意味着尽管许多shell(例如bash
,zsh
,ksh
)都具有它,但其他壳(例如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
。
您使用nohup <command> & disown
正确放置了第5点上的命令,而使用nohup
或disown
中的任何一个则不需要其他命令。它们的目的是相同的(忽略SIGHUP
),但是它们的功能略有不同。因此,该命令可以简化为nohup <command> &
。