bash脚本中“ -D”和“&”之间的区别

时间:2020-03-23 13:46:09

标签: bash shell terminal sh

根据此docker tutorial

有什么区别
./my_first_process -D

./my_main_process &

它们似乎都不受bash脚本的干扰并在后台运行

2 个答案:

答案 0 :(得分:3)

&告诉外壳程序将其前面的命令放入后台。 -D只是传递给my_first_process并由它解释的标志;它与外壳完全无关。

您将必须查看my_first_process的文档,以了解-D的作用…可能有任何意义。例如。在npm中,-D的意思是“开发”,而在其他一些工具中,它的意思是“目录”。在diff中,它的意思是“输出合并的文件以显示'#ifdef NAME'差异。”

答案 1 :(得分:1)

一些程序,按照惯例,以-D作为自我守护的指令。这样做类似于以下内容:

  • 调用fork(),如果返回0,则退出(因此只有子代可以幸存)。
  • 如果将stdin,stdout和stderr连接到控制台,则将它们关闭(最好将它们的文件描述符替换为/dev/null上的句柄,因此写入操作不会触发错误)。
  • 致电setsid()创建一个新会话。
  • 再次调用fork(),如果再次返回0,则退出。

这比someprogram &要做的工作还要多!自我守护的程序无法再登录到终端,并且如果终端本身关闭也将不再受到影响。对于刚刚在后台启动的程序,情况并非如此。

要从bash中获得与相同行为类似的东西,正确的代码应类似于:

someprogram </dev/null >/dev/null 2>&1 & disown -h

...其中disown -h告诉外壳程序不要将SIGHUP传递给该进程。经常看到用于此目的的外部工具nohup也很常见(尽管默认情况下,如果它们指向TTY(最终目的),它会将stdout和stderr重定向到名为nohup.out的文件- -确保没有 指向终端,因此,即使终端消失了,对它们的写入也不会开始失败-实现):

nohup someprogram >/dev/null &
相关问题