web-dev-qa-db-ja.com

複数のスクリプトを並列bashスクリプトで実行する

直列に実行される他のスクリプトを含む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内のコードです。太字のコマンドを実装するには、40秒ほどかかります。メインスクリプトでchurn.sh&の後にアンパサンドを付けると、sedがchurn.txtファイルを読み取れないというエラーがスローされます(まだ作成されていないため)。出力がファイルに保存されるまで待機しないようです。そのコマンドの後に待機を挿入しましたが、役に立ちません。

47
Bdar

&を使用してバックグラウンドで実行すると、トリックが実行されます

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

wait
echo "All 3 complete"

それぞれの新しいプロセスを分岐します。

Bash wait も、親スクリプトで実行するものがある場合、コメントに記載されているように便利ですafterこれらの3つの仕上げ。

引数なしで、すべての子プロセスが完了するのを待ってから、親スクリプトの実行を再開します。


直面している問題は、これに直接関係しているようです。変数セットは、 変数が定義されているサブシェル のみに表示されます。そのため、親スクリプトでOUT_DIRを指定している場合、子スクリプトが分岐するときに子スクリプトからは見えません。この場合に正しいことは、環境変数として変数をexportすることです。

101