У нас более 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