当前位置: 首页>>技术教程>>正文


“<command>”之间的区别&放弃”和“ nohup<command> &放弃”

, , ,

问题描述

这是我对&disownnohup的用法的理解:

  • <command>:在终端的当前bash实例中在前台运行该进程(即该进程被列为bash前台作业,并且stdinstdoutstderr仍绑定到该终端);无法避免挂断;

  • <command> &:在后台在终端的当前bash实例中运行该进程(即该进程被列为bash后台作业,并且stdinstdoutstderr仍绑定到该终端);无法避免挂断;

  • <command> & disown:在后台在终端的当前bash实例中运行该进程,但是该进程与bash ‘s jobs’列表分离(即该进程未列为bash前台/后台作业,并且stdinstdoutstderr仍绑定到该进程终点站);不受挂断的困扰;

  • nohup <command> & disown:在后台在终端的当前bash实例中运行该进程,但该进程与bash ‘s jobs’列表分离(即该进程未列为bash前台/后台作业,并且stdinstdoutstderr仍未绑定到终端);免于挂断;

因此,除了nohup <command> & disown阻止stdin并默认将stdoutstderr重定向到nohup.out之外,在我看来,它似乎可以完全等同于<command> & disown

以上是正确的吗?有误解吗?

最佳思路

您的理解基本上是正确的。 disownnohup均用于允许您退出正在运行的Shell会话而无需停止正在运行的作业。一些说明:

  • 没有理由运行nohup command & disownnohup已经为您取消了它。

  • nohupdefined by POSIXdisown is not是。这意味着尽管许多shell(例如bashzshksh)都具有它,但其他壳(例如tcshcshdashsh)却没有。

  • disown可以在命令启动后使用,而nohup必须在使用之前使用。

据我所知,这两个命令的实际效果是相同的。它们各自具有彼此不具备的功能(请参阅help disownman 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点上的命令,而使用nohupdisown中的任何一个则不需要其他命令。它们的目的是相同的(忽略SIGHUP),但是它们的功能略有不同。因此,该命令可以简化为nohup <command> &

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/11372.html,未经允许,请勿转载。