kos*_*kos 52 command-line bash nohup background-process
这是我对&,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。
以上都是正确的吗?有什么误解吗?
ter*_*don 45
你的理解基本正确。这两个disown和nohup使用,让您无需停止运行的作业退出正在运行的shell会话。一些澄清:
没有理由跑nohup command & disown,nohup已经为你否认了。
nohup是由POSIX定义而disown 不是。这意味着虽然许多 shell(例如bash、zsh、ksh)拥有它,但其他的(例如tcsh、csh、dash和sh)不会拥有它。
disown可以在命令启动后使用,而nohup必须在之前使用。
据我所知,这两个命令的实际效果是一样的。他们每个人都有对方所缺乏的特征(见help disown和man 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> &.