2013-03-26 13 views
46

私は、シリーズ内で実行される他のスクリプトを含む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ファイルを読むことができないというエラーがスローされます(まだ作成されていないので)。出力がファイルに保存されるまで待機しないようです。私はそのコマンドの後に待機を挿入しましたが、それは助けになりません。バックグラウンドでそれを実行するために&を使用し

答えて

91

は、それが彼らのそれぞれのための新しいプロセスをフォークしますトリック

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

wait 
echo "All 3 complete" 

を行います。

の後にの後に、親スクリプトで実行する何かがある場合、bash waitもコメントに記載されているように便利です。

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


あなたが直面している問題は、この問題に直接関係しているようです。変数セットはsub-shell in which they are definedにのみ表示されます。したがって、親スクリプトにOUT_DIRが指定されている場合は、フォークアウト時に子スクリプトには表示されません。この場合、正しい変数は環境変数としての変数exportです。

+15

さらに、 'wait'を呼び出すと、すべてのバックグラウンドジョブが完了するまで親スクリプトが終了しなくなります。 –

+0

@DarkCthulhu私はすでにそれを使用しています。問題は次のとおりです。 1行は--numstatを使ってgitからデータを取得し、それをいくつかのファイルに出力します。そのファイルは次の行で使用されますが、&commandは行を実行して次の行にスキップするため、次の行は 'ファイルが存在しません'というエラーをスローします。それをtxtファイルに保存します。すべてのスクリプトファイルにはほぼ同じ問題があります。 – Bdar

+1

@ Bdarスクリプトはお互いに独立していると言ったばかりです。あなたの実行の間に少し時間を追加したいなら、 'sleep n && churn.sh&'を試すことができます。そうでなければ、順番に実行するほうがよい。 –

関連する問題