【问题标题】:Run two shell script in parallel and capture their output并行运行两个 shell 脚本并捕获它们的输出
【发布时间】:2015-07-11 02:19:39
【问题描述】:

我想要一个 shell 脚本,它配置几个东西,然后调用另外两个 shell 脚本。我希望这两个脚本并行运行,并且我希望能够获取并打印它们的实时输出。 这是我的第一个脚本,它调用了另外两个

#!/bin/bash
#CONFIGURE SOME STUFF
$path/instance2_commands.sh 
$path/instance1_commands.sh

这两个进程试图部署两个不同的应用程序,每个进程都需要大约 5 分钟,所以我想并行运行它们并查看它们的实时输出,以便我知道它们在哪里执行部署任务。这可能吗?

【问题讨论】:

    标签: linux shell


    【解决方案1】:

    并行运行两个脚本可能如下所示:

    #!/bin/bash
    #CONFIGURE SOME STUFF
    $path/instance2_commands.sh >instance2.out 2>&1 &
    $path/instance1_commands.sh >instance1.out 2>&1 &
    wait
    

    注意事项:

    • wait 暂停,直到孩子们 instance1 和 instance2 完成
    • 每一行的2>&1 将错误消息重定向到相关的输出文件
    • 行尾的& 导致主脚本在分叉后继续运行,从而产生一个子脚本与主脚本的其余部分同时执行该脚本行
    • 每个脚本都应将其输出发送到单独的文件。当实例生成相似的输出消息时,将两者发送到同一个文件会在视觉上很混乱并且无法分类。
    • 您可以尝试在使用任何阅读器运行脚本时读取输出文件,例如less instance1.out 但是输出可能会卡在缓冲区中并且不是最新的。为了解决这个问题,程序必须以行缓冲或非缓冲模式打开标准输出。您也可以使用-f 或> 来刷新显示。
    来自article on Apache Spark and parallel processing on my blog 的

    示例 D 提供了一个类似的 shell 脚本,用于计算所有内核上 Pi 的一系列总和,给定一个用于计算一个内核上的总和的 C 程序。这有点超出了问题的范围,但我会提到它以防您想看到更深入的示例。

    【讨论】:

      【解决方案2】:

      很有可能,把你的脚本改成这样:

          #!/bin/bash
          #CONFIGURE SOME STUFF
          $path/instance2_commands.sh >> script.log 
          $path/instance1_commands.sh >> script.log
      

      它们都将输出到同一个文件,您可以通过运行来查看该文件:

          tail -f script.log
      

      如果您愿意,可以输出到 2 个不同的文件。只需将每个 ling 更改为输出 (>>) 为第二个文件名。

      【讨论】:

      • 如果你想并行运行它们,你需要在最后加上一个 & 符号,像这样: $path/instance2_commands.sh >> script.log &
      • 不要将它们都记录到同一个文件中。输出没有协调。
      【解决方案3】:

      这就是我最终使用 Paul 指令编写它的方式。

      source $path/instance2_commands.sh >instance2.out 2>&1 &
      source $path/instance1_commands.sh >instance1.out 2>&1 &
      tail -q -f instance1.out -f instance2.out --pid $!
      wait
      sudo rm instance1.out
      sudo rm instance2.out
      

      我在两个进程中的日志是不同的,所以我不在乎是否没有全部放在一起,这就是我将它们全部放在一个文件中的原因。

      【讨论】:

        猜你喜欢
        • 2014-05-11
        • 2021-11-16
        • 2018-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-04
        • 2013-08-14
        • 2022-11-16
        相关资源
        最近更新 更多