并行运行两个shell脚本并捕获它们的输出

时间:2015-07-11 02:19:40

标签: linux shell

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

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

这两个过程尝试部署两个不同的应用程序,每个过程大约需要5分钟,因此我想并行运行它们并查看它们的实时输出,因此我知道它们在部署任务中的位置。这可能吗?

3 个答案:

答案 0 :(得分:6)

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

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

注意:

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

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

答案 1 :(得分:1)

很有可能,将脚本更改为:

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

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

    tail -f script.log

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

答案 2 :(得分:0)

这是我最后使用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

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