【问题标题】:The difference between "-D" and "&" in bash scriptbash脚本中“-D”和“&”的区别
【发布时间】:2020-07-03 23:41:49
【问题描述】:

据此docker tutorial

有什么区别

./my_first_process -D

./my_main_process &

它们似乎都可以解锁 bash 脚本并在后台运行

【问题讨论】:

  • 听起来你的my_first_process-D 视为自我妖魔化的指令。那是特定于该单个程序的行为,而不是普遍正确的行为。
  • ...也就是说,自我守护进程并不是一个特别好的习惯;流程监督系统更难监控以这种方式运行的服务器。如果程序是您控制的程序,请务必将其保留为选项而不是默认设置。
  • 顺便说一句,该教程展示了几种不良做法。见 f/e Why is testing "$?" to see if a command succeeded or not, an anti-pattern?

标签: bash shell terminal sh


【解决方案1】:

& 告诉 shell 把前面的命令放到后台。 -D 只是一个传递给my_first_process 并由它解释的标志;它与外壳完全无关。

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

【讨论】:

    【解决方案2】:

    一些程序,按照惯例,将-D 作为self-daemonize的指令。这样做看起来如下所示:

    • 调用fork(),如果返回0则退出(所以只有孩子存活)。
    • 如果 stdin、stdout 和 stderr 连接到控制台,则关闭它们(理想情况下,将它们的文件描述符替换为 /dev/null 上的句柄,因此写入不会触发错误)。
    • 致电setsid() 以创建新会话。
    • 再次调用fork(),如果再次返回0则退出。

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

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

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

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

    nohup someprogram >/dev/null &
    

    【讨论】:

      猜你喜欢
      • 2014-06-26
      • 2013-07-31
      • 2015-11-07
      • 2019-12-05
      • 2012-08-12
      • 2014-09-09
      • 2023-03-13
      • 2012-12-18
      相关资源
      最近更新 更多