LINUX.ORG.RU
ФорумAdmin

Распарарелить команду в баше

 


2

2

Есть у меня вот такой незасмыловатый скрипт

find "$SOURCEDIR" -type f -name "*2015_0[1-3]_[0-3][0-9].txt.tar.gz" | while read file
do
	glacier-cmd upload $GLACIER_VAULT "$file" --description \""$(basename "${file}")"\" >> "$LOGFILE"
	COUNTER=$((COUNTER+1)) && echo $COUNTER > "$COUNTER_FILE"_1
done

Всё прекрасно работает, но только ооооооочень медленно. Он за полдня роботы загрузил 45000 файлов, а всего их 3,7млн.

Вот сижу и думаю, можноли как-то одновременно запускать несколько(или много) экземпляров glacier-cmd, но что бы оно не грузило одни и теже файлы.

Может подкинете идею?

★★★

Ответ на: комментарий от anonymous

square wheels у меня в скрипте или ...? ;)

GoNaX ★★★
() автор топика

Psych218, YAR, zolden спасибо за наводку, сейчас что-то выберу.

GoNaX ★★★
() автор топика

при паралеллизме со счётчиком будет труднее. если отбросить этот ньюанс то
складываешь закачку скрипт script.sh, который принимает аргумент:

#!/bin/bash
file=$@
glacier-cmd upload $GLACIER_VAULT "$file" --description \""$(basename "${file}")"\" >> "$LOGFILE"


find "$SOURCEDIR" -type f -name "*2015_0[1-3]_[0-3][0-9].txt.tar.gz" | xargs -n1 -P10 script.sh

-n1 - берет 1 строчку как единственный аргумент, передает его в script.sh
-P10 -10потоков

bl ★★★
()
Ответ на: комментарий от bl

Твой вариант сработал. Сначала делал с gnu parallel, но у заказчиков параноя, а parallel нет в репах Centos. В общем остановился на xargs, ведь доустанавливать ничего не нужно.

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

GoNaX ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.