Назад | Перейти на главную страницу

Выполнять цикл Shell параллельно, но только N рабочих

У нас более 100 репозиториев git, и иногда мне хочется grep в общем и целом.

Для обновления репозиториев я использую это:

for repo in *; do (cd $repo; git checkout master; git pull); done

Это довольно медленно.

Как это ускорить?

Запуск всех обновлений одновременно вызовет слишком много процессов.

Мне нужен способ уменьшить нагрузку до N рабочих.

Есть у кого-нибудь решение этой проблемы?

Вы можете использовать GNU parallel для выполнения этой задачи. С домашней страницы GNU parallel,

«Задание также может быть командой, которая читает из конвейера. GNU parallel может затем разделить ввод и направить его на команды параллельно».

Есть отличный учебник и этот конкретный раздел касается того, что именно вы спросили.

Изменить: вот команда, которую вы можете использовать. (Немного изменено из ответа Оле Танга)

parallel -j<number of jobs to run> 'cd {} && git checkout master && git pull' ::: */

Это запустит параллельное "количество заданий", которое вы указали, и выполнит все, что вы попросили об этом.

HTH

Вы можете использовать xargs для выполнения этой работы, например

(for repo in *
    do
    [ -d ${repo} ] && echo ${repo}
    done ) | xargs -I{} -P4 ./gitActions.sh {}

Флаг -P4 указывает xargs запускать до 4 одновременных процессов, чтобы вы могли играть с количеством процессов, которое вам нужно / нужно.

Тогда ваш файл gitActions.sh должен содержать:

#!/bin/bash
repo=$1
cd $repo; git checkout master; git pull

При использовании GNU Parallel это выглядит так:

parallel -j77 'cd {} && git checkout master && git pull' ::: */ 

Это дает 77 рабочих.

GNU Parallel - это общий распараллеливатель, который упрощает параллельное выполнение заданий на одной или нескольких машинах, к которым у вас есть доступ по ssh. Часто может заменить for петля.

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

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

Монтаж

Если GNU Parallel не входит в комплект поставки вашего дистрибутива, вы можете выполнить персональную установку, которая не требует корневого доступа. Это можно сделать за 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

Пройдите по учебнику: http://www.gnu.org/software/parallel/parallel_tutorial.html

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