这是我对&、disown和nohup的用法的理解:
<command>:在前台运行终端当前bash实例中的进程(即进程被列为bash前台作业,stdin、stdout和stderr仍然绑定到终端);<command> &:在后台运行终端当前bash实例中的进程(即进程被列为bash后台作业,stdin、stdout和stderr仍然绑定到终端);<command> & disown:在后台运行终端当前bash实例中的进程,但进程与bash**'s作业‘列表分离(即进程不作为bash前台/后台作业列出,stdin、stdout和stderr仍然绑定到终端);不受干扰**;nohup <command> & disown:在后台运行终端当前bash实例中的进程,但进程与bash**'s作业‘列表分离(即进程不作为bash前台/后台作业列出,stdin、stdout和stderr仍然绑定到终端);因此,除了默认情况下nohup <command> & disown阻塞stdin并将stdout和stderr重定向到nohup.out之外,在我看来,它似乎完全等同于<command> & disown。
以上都是正确的吗?有误解吗?
发布于 2015-04-21 15:51:58
你的理解基本上是正确的。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),但它们的基本功能是相同的,是的。
要更详细地讨论这些工具以及它们之间的差异,请看下面的答案:
发布于 2015-04-21 09:51:05
虽然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> &。
https://askubuntu.com/questions/611968
复制相似问题