在并行bash脚本中运行多个脚本

在并行bash脚本中运行多个脚本,bash,parallel-processing,Bash,Parallel Processing,我有一个bash脚本,其中包含其他以系列方式运行的脚本。然而,运行它们需要相当长的时间。有没有办法并行运行这些脚本以提高总体性能?它们相互独立 它看起来类似于: #!/bin/bash #some code here cppcheck.sh churn.sh run.sh 更新: **git log --pretty=format: --numstat | perl -ane'$c{$F[2]} += abs($F[0]+$F[1]) if $F[2];END {print "$_\t$

我有一个bash脚本,其中包含其他以系列方式运行的脚本。然而,运行它们需要相当长的时间。有没有办法并行运行这些脚本以提高总体性能?它们相互独立

它看起来类似于:

#!/bin/bash

#some code here
cppcheck.sh
churn.sh
run.sh

更新:

**git log --pretty=format: --numstat | perl -ane'$c{$F[2]} += abs($F[0]+$F[1]) 
if $F[2];END {print "$_\t$c{$_}\n" for sort keys %c}' > ${OUTPUT_DIR}/churn.txt**
sed -i -e '/deps/d;/build/d;/translations/d;/tests/d' -e 30q ${OUTPUT_DIR}/churn.txt
sort -r -n -t$'\t' -k2 ${OUTPUT_DIR}/churn.txt -o ${OUTPUT_DIR}/churn.txt
echo "set term canvas size 1200, 800; set output '${OUTPUT_DIR}/output.html'; 
unset key; set bmargin at screen 0.4; set xtics rotate by -90 scale 0,0; 
set ylabel 'Number of lines changed (total)'; set title 'Files with high churn 
level';set boxwidth 0.7; set style fill solid; set noborder; 
plot '${OUTPUT_DIR}/churn.txt' using 2:xticlabels(1) with boxes" | gnuplot
echo "finished running churn.sh!"

这是churn.sh中的代码。bold命令需要大约40秒才能实现。如果在一个主脚本中,我在chorn.sh&之后加上了符号,它会抛出一个错误,说sed无法读取chorn.txt文件(因为它还没有创建)。似乎不会等到输出保存到文件中。我在该命令之后插入了wait,但它没有任何帮助。

使用
&
在后台运行它就可以了

cppcheck.sh &
churn.sh &
run.sh &

wait
echo "All 3 complete"
这将为他们每个人提供一个新的流程

如注释中所述,如果要在父脚本上运行某个东西,在这三个完成之后,bash也会派上用场

如果没有参数,它将等待所有子进程完成,然后恢复父脚本的执行



你面临的问题似乎与此直接相关。变量集仅对用户可见。因此,如果在父脚本中指定了
OUT\u DIR
,子脚本在分叉时将看不到它。在这种情况下,正确的做法是
将变量导出为环境变量。

此外,调用“wait”将确保在所有后台作业完成之前不会退出父脚本completed@DarkCthulhu我已经用过了。问题如下。一行使用--numstat从git获取数据并将其输出到某个文件。然后在下一行中使用该文件,但由于&command开始执行该行并跳到下一行,下一行会抛出一个错误,称“文件不存在”,因为获取数据并将其保存在txt文件中需要一段时间。在所有脚本文件中几乎都存在类似的问题。@Bdar您刚才说脚本彼此独立。如果您想在它们的执行之间增加一点时间,可以尝试
sleep n&&chorn.sh&
。否则,最好按顺序执行它们。@Darkthulhu是的,这些脚本彼此独立。但在cppcheck内部有一行创建输出(需要大约20秒才能完成),下面的一行正在使用该输出执行操作,但它似乎会跳过下一行,直到创建输出为止。在剧本里面。那么,这是否意味着&在脚本中也处于活动状态?@Bdar我没有任何此类问题。我只是用类似的东西在本地进行了测试,即使有延迟。如果我不得不猜测,我会猜测您的
${OUTPUT\u DIR}
没有在子脚本中设置。您正在父脚本中执行
导出输出\u DIR=
?你能用硬编码的输出目录检查一下吗?