2016-03-24 1 views
1

У меня есть Баш скрипт, который запускает 4 другой процесс в фоновом режиме, и вы можете увидеть код ниже:Как проверить время выполнения сценария Баш, который начинается 4 другой процесс фон

declare -a arr=("seed_automation_data_1" "seed_automation_data_2" "seed_automation_data_3" "seed_automation_data_4") 
command="bundle exec rake db:seed:" 
for i in "${arr[@]}" 
do 
    $command$i & 
done 

Этот Баш скрипт на самом деле работает rake task в rails framework.

$ команда $ я &

Эта специфическая линия начинает четыре различных процесса в фоновом режиме: -

bundle exec rake db:seed:seed_automation_data_1 
bundle exec rake db:seed:seed_automation_data_2 
bundle exec rake db:seed:seed_automation_data_3 
bundle exec rake db:seed:seed_automation_data_4 

Поскольку существует четыре различных процесса в фоновом режиме, я не может знать, когда bash script равен FINISHED, или рассчитать execution-time.

Есть ли способ распечатать некоторые операторы, которые покажут, что скрипт `закончен?

ответ

2

Посмотрите на wait function в bash. Он просто ждет завершения всех дочерних процессов. Затем вы можете легко вычислить время, прошедшее, например. используя внутреннюю переменную SECONDS (объяснение here):

SECONDS=0 

declare -a arr=("seed_automation_data_1" "seed_automation_data_2" "seed_automation_data_3" "seed_automation_data_4") 
command="bundle exec rake db:seed:" 
for i in "${arr[@]}" 
do 
    $command$i & 
done 

wait 
echo $SECONDS 
2

Похоже, работа для GNU Parallel:

declare -a arr=("seed_automation_data_1" "seed_automation_data_2" "seed_automation_data_3" "seed_automation_data_4") 
parallel --joblog - bundle exec rake db:seed:{} ::: "${arr[@]}" 

GNU Parallel является общим распараллеливатель и делает легко выполнять задания параллельно на том же машины или на нескольких машинах, к которым вы имеете доступ к ssh. Он часто может заменить петлю for.

Если у вас есть 32 различных заданий, которые вы хотите работать на 4-х процессоров, прямо вперед способ распараллеливания является выполнение 8 заданий на каждом CPU:

Simple scheduling

GNU Parallel вместо порождает новый процесс, когда один заканчивается - поддержание процессоров активным и тем самым экономя время:

GNU Parallel scheduling

Установка

Если GNU Parallel не упакован для вашего дистрибутива, вы можете выполнить личную установку, которая не требует доступа root.Это может быть сделано в течение 10 секунд, делая это:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash 

Для других вариантов установки см http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Подробнее

Другие примеры: http://www.gnu.org/software/parallel/man.html

смотреть интро видео: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Прогулка по t он учебник: http://www.gnu.org/software/parallel/parallel_tutorial.html

Зарегистрируйтесь на список адресов электронной почты, чтобы получить поддержку: https://lists.gnu.org/mailman/listinfo/parallel

+0

GNU Parallel удивителен и первоначально я использовал только что, но я заметил, что с помощью '&' больше времени эффективного. – python

+0

@python Исправить. Пока вы не заботитесь о смешанном выпуске, и у вас нет больше заданий, чем ваша система может обрабатывать их все параллельно, «&» будет более эффективным. –

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