并行运行两个shell脚本并捕获它们的输出
问题描述:
我想要一个shell脚本,它配置了几件事情,然后调用另外两个shell脚本。我希望这两个脚本并行运行,并且希望能够获得并打印它们的实时输出。 这里是我这就要求其他两个并行运行两个shell脚本并捕获它们的输出
#!/bin/bash
#CONFIGURE SOME STUFF
$path/instance2_commands.sh
$path/instance1_commands.sh
这两个过程尝试部署两个不同的应用和他们每个人花了大约5分钟,从而我想并行运行它们,也看到他们的现场输出,所以第一个脚本我知道他们在部署任务的位置。这可能吗?
答
并行运行这两个脚本可以是这样的:
#!/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
在每一行重定向错误信息到相关输出文件 -
&
at一行的结尾会导致主脚本在分叉后继续运行,从而产生一个正在执行脚本的该行并与主脚本的其余部分同时运行的子脚本,每个脚本应将其输出发送到单独的文件。当两个实例产生相似的输出消息时,将两者发送到相同的文件将会在视觉上变得混乱并且不可能整理出来。 - 当脚本与任何阅读器一起运行时,您可能会尝试读取输出文件,例如,但是,输出可能会卡在缓冲区中,而不是最新的。为了解决这个问题,程序必须以行缓冲或无缓冲模式打开stdout。您也可以使用
-f
或>
刷新显示。
实施例d从article on Apache Spark and parallel processing on my blog提供了用于给定的用于计算在一个核心之和的C程序计算在所有芯的一系列Pi的总和,一个类似的外壳脚本。这有点超出了问题的范围,但我提到它以防万一您想看到更深层次的例子。
答
这是非常可能的,改变你的脚本是这样的:
#!/bin/bash
#CONFIGURE SOME STUFF
$path/instance2_commands.sh >> script.log
$path/instance1_commands.sh >> script.log
他们都将输出到同一个文件,你可以通过运行看该文件:
tail -f script.log
如果您就像你可以输出到2个不同的文件一样。只需更改每个ling即可将(>>)输出到第二个文件名。
答
这就是我最终使用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
我在两个进程中的日志是不同的,所以我不在乎是不是都在一起,这就是为什么我把它们全部放在一个文件中。
如果你想并行运行它们,你需要在末尾加一个和号(&):$ path/instance2_commands.sh >> script.log& –
不要把它们都记录到相同的地方文件。没有输出的协调。 – Paul