2013-03-26 21 views
46

Mam skrypt basha, który zawiera inne skrypty wewnątrz, które są uruchamiane w serii. Jednak uruchomienie wszystkich wymaga dość czasu. Czy istnieje sposób na równoległe uruchamianie tych skryptów w celu poprawy ogólnej wydajności? Są od siebie niezależni.Uruchamianie kilku skryptów w równoległym skrypcie bash

To wygląda podobnie do:

#!/bin/bash 

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

Aktualizacja:

**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!" 

Jest to kod wewnątrz churn.sh. Pogrubiona komenda zajmuje około 40 sekund. Jeśli w głównym skrypcie umieściłem ampersand po churn.sh &, wyświetla błąd mówiący, że sed nie może odczytać pliku churn.txt (ponieważ nie został jeszcze utworzony). Wygląda na to, że nie czeka, aż wynik zostanie zapisany w pliku. Wstawiłem czekać po tym poleceniu, ale to nie pomaga.

Odpowiedz

91

Używanie & uruchomić go w tle rade

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

wait 
echo "All 3 complete" 

Będzie widelec się nowy proces dla każdego z nich.

Przydaje się też bash wait, jak podano w komentarzach, jeśli masz coś, co można uruchomić na skrypcie rodzica, po tych trzech zakończeniu.

Bez argumentu będzie czekać na zakończenie wszystkich procesów podrzędnych, a następnie wznowi wykonywanie skryptu nadrzędnego.


Problemy, z którymi się mierzysz, wydają się być bezpośrednio z tym związane. Zestaw zmiennych jest widoczny tylko dla sub-shell in which they are defined. Tak więc, jeśli w skrypcie macierzystym jest określony OUT_DIR, nie będzie on widoczny dla skryptu podrzędnego po jego rozwidleniu. Właściwą rzeczą do zrobienia w tym przypadku będzie export zmienna jako zmienna środowiskowa.

+15

Ponadto wywołanie funkcji "oczekiwania" spowoduje, że skrypt macierzysty nie zostanie zakończony, dopóki wszystkie zadania w tle nie zostaną zakończone. –

+0

@DarkCthulhu Już go użyłem. Problem jest następujący. Jedna linia pobiera dane z git za pomocą --numstat i wyświetla je do jakiegoś pliku. Plik ten jest następnie wykorzystywany w następnym wierszu, ale ponieważ polecenie rozpoczyna wykonywanie linii i przechodzi do następnego wiersza, w poniższym wierszu pojawia się komunikat o błędzie "plik nie istnieje", ponieważ pobranie danych zajmuje trochę czasu. zapisz go w pliku txt. To prawie podobny problem we wszystkich plikach skryptowych. – Bdar

+1

@Bdar Po prostu powiedziałeś, że skrypty są od siebie niezależne. Jeśli chcesz dodać trochę czasu między ich wykonaniami, możesz spróbować 'sleep n && churn.sh &'. W przeciwnym razie lepiej wykonać je kolejno. –

Powiązane problemy