2013-03-26 2 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 파일을 읽을 수 없다는 오류가 발생합니다 (아직 생성되지 않았으므로). 출력이 파일에 저장 될 때까지 기다리지 않는 것 같습니다. 그 명령 다음에 대기를 삽입했지만 도움이되지 않습니다. 트릭을

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

wait 
echo "All 3 complete" 

그것은 그들 각각에 대해 새로운 프로세스를 포크 뜻을 행하려 백그라운드에서 실행하는 &를 사용

답변

91

.

bash wait도 부모 스크립트에서 실행될 내용이 있다면이 끝난 후 이 끝나는 주석에 설명 된대로 유용 할 것입니다.

인수없이 모든 하위 프로세스가 완료 될 때까지 대기 한 다음 상위 스크립트의 실행을 다시 시작합니다.


직면 한 문제는 이와 관련이있는 것으로 보입니다. 변수 세트는 sub-shell in which they are defined에만 표시됩니다. 따라서 부모 스크립트에 OUT_DIR이 지정되어 있으면 포크 오프시 하위 스크립트에 표시되지 않습니다. 이 경우 올바른 작업은 환경 변수로 변수 export입니다.

+15

또한 '대기'를 호출하면 모든 백그라운드 작업이 완료 될 때까지 부모 스크립트가 종료되지 않습니다. –

+0

@DarkCthulhu 이미 사용했습니다. 문제는 다음과 같습니다. 한 줄은 --numstat을 사용하여 git에서 데이터를 가져와 일부 파일로 출력합니다. 이 파일은 다음 줄에서 사용되지만, & command가 줄을 실행하고 다음 줄로 건너 뛰기 때문에 다음 줄은 'file does not exist'라는 오류를 발생시킵니다. txt 파일에 저장하십시오. 모든 스크립트 파일에서 거의 비슷한 문제입니다. – Bdar

+1

@ Bdar 방금 스크립트가 서로 독립적이라고했습니다. 실행 사이에 약간의 시간을 추가하고 싶다면'sleep n && churn.sh &'를 시도해보십시오. 그렇지 않으면 순서대로 실행하는 것이 좋습니다. –

관련 문제