Сценарии оболочки: использование xargs для выполнения параллельных экземпляров функции оболочки - PullRequest
11 голосов
/ 23 июля 2010

Я пытаюсь использовать xargs в сценарии оболочки для запуска параллельных экземпляров функции, которую я определил в том же сценарии.Функция умножает выборку страницы, и поэтому важно, чтобы страницы фактически выбирались одновременно в параллельных процессах, а не в фоновых процессах (если мое понимание этого неверно и между ними есть незначительная разница, просто дайте мне знать).

Функция:

function time_a_url ()
{
     oneurltime=$($time_command -p wget -p $1 -O /dev/null 2>&1 1>/dev/null | grep real | cut -d" " -f2)
     echo "Fetching $1 took $oneurltime seconds."
}

Как сделать это с каналом xargs в форме, которая может несколько раз запускать time_a_url параллельно в качестве аргумента?И да, я знаю о параллельной GNU, у меня просто нет права устанавливать программное обеспечение там, где я пишу это.

Ответы [ 3 ]

11 голосов
/ 24 июля 2010

Вот демонстрация того, как вы могли бы заставить свою функцию работать:

$ f() { echo "[$@]"; }
$ export -f f
$ echo -e "b 1\nc 2\nd 3 4" | xargs -P 0 -n 1 -I{} bash -c f\ \{\}
[b 1]
[d 3 4]
[c 2]

Ключи к выполнению этой работы - export функция, поэтому bash, что xargsspawns увидит это и выйдет из пробела между именем функции и экранированными скобками.Вы должны быть в состоянии приспособить это, чтобы работать в вашей ситуации.Вам нужно будет настроить аргументы для -P и -n (или удалить их) в соответствии с вашими потребностями.

Возможно, вы можете избавиться от grep и cut.Если вы используете встроенную в Bash time, вы можете указать выходной формат, используя переменную TIMEFORMAT.Если вы используете GNU /usr/bin/time, вы можете использовать аргумент --format.Любой из них позволит вам также сбросить -p.

Вы можете заменить эту часть вашей команды wget: 2>&1 1>/dev/null на -q.В любом случае, у вас есть обратное.Правильный порядок будет >/dev/null 2>&1.

1 голос
/ 24 июля 2010

В Mac OS X:

xargs: макс.процессы должны быть> 0 (для: xargs -P [> 0])

f() { echo "[$@]"; }
export -f f

echo -e "b 1\nc 2\nd 3 4" | sed 's/ /\\ /g' | xargs -P 10 -n 1 -I{} bash -c f\ \{\}

echo -e "b 1\nc 2\nd 3 4" | xargs -P 10 -I '{}' bash -c 'f "$@"' arg0 '{}'
0 голосов
/ 24 июля 2010

Если вы установите GNU Parallel в другой системе, вы увидите, что функциональность находится в одном файле (который называется параллельным).

Вы сможете просто скопировать этот файл в свой ~ / bin.

...