2013-03-26 2 views
46

У меня есть скрипт bash, содержащий другие скрипты внутри, которые запускаются последовательно. Однако для их запуска требуется достаточно времени. Есть ли способ запускать эти сценарии параллельно, чтобы улучшить общую производительность? Они независимы друг от друга.Запуск нескольких скриптов в параллельном сценарии bash

Он похож на:

#!/bin/bash 

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

Update:

**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 секунд для реализации. Если в главном скрипте я помещаю амперсанд после churn.sh &, он выдает сообщение об ошибке, когда sed не может прочитать файл churn.txt (так как он еще не создан). Кажется, что он не дожидается, пока вывод не будет сохранен в файле. Я вставил wait после этой команды, но это не поможет.

ответ

91

Использование &, чтобы запустить его в фоновом режиме будет делать трюк

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

wait 
echo "All 3 complete" 

Это будет раскошелиться от нового процесса для каждого из них.

Баш wait также пригодится, как указано в комментариях, если у вас есть что-то будет работать на родительский сценарий, после эти три послевкусие.

Без аргумента он будет ждать завершения всех дочерних процессов, а затем возобновит выполнение родительского скрипта.


Проблемы, с которыми вы сталкиваетесь, по-видимому, напрямую связаны с этим. Переменные устанавливаются только на sub-shell in which they are defined. Итак, если у вас есть OUT_DIR, указанный в родительском скрипте, он не будет виден дочернему скрипту при его разрыве. Правильная вещь в этом случае была бы export переменной как переменной среды.

+15

Кроме того, вызов «wait» гарантирует, что родительский скрипт не будет завершен, пока все фоновые задания не будут завершены. –

+0

@DarkCthulhu Я уже использовал это. Проблема заключается в следующем. Одна строка получает данные из git с использованием --numstat и выводит его в некоторый файл. Затем этот файл используется в следующей строке, но поскольку команда & запускает строку и переходит к следующей строке, следующая строка выдает сообщение об ошибке: «Файл не существует», поскольку для получения данных и сохраните его в txt-файле. Это почти аналогичная проблема во всех файлах сценариев. – Bdar

+1

@Bdar Вы только что сказали, что скрипты не зависят друг от друга. Если вы хотите добавить немного времени между их выполнением, вы можете попробовать 'sleep n && churn.sh &'. Кроме того, вам лучше выполнять их последовательно. –

Смежные вопросы