Shell Scripting: использование xargs для выполнения параллельных экземпляров функции оболочки
Я пытаюсь использовать xargs в оболочке script для запуска параллельных экземпляров функции, определенной мной в том же script. Функция умножает выборку страницы и поэтому важно, чтобы страницы были фактически выбраны параллельно в параллельных процессах, а не в фоновых процессах (если мое понимание этого неверно и существует незначительная разница между ними, просто дайте мне знать).
Функция:
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, я просто не имею права устанавливать программное обеспечение, где я пишу это.
Ответы
Ответ 1
Вот демонстрация того, как вы могли бы заставить свою работу работать:
$ f() { echo "[[email protected]]"; }
$ 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
, создаваемый xargs
, будет видеть ее и избежать пробела между именем функции и экранированными скобками. Вы должны уметь адаптировать это для работы в своей ситуации. Вам нужно будет настроить аргументы для -P
и -n
(или удалить их) в соответствии с вашими потребностями.
Вероятно, вы можете избавиться от grep
и cut
. Если вы используете Bash builtin time
, вы можете указать выходной формат, используя переменную TIMEFORMAT
. Если вы используете GNU /usr/bin/time
, вы можете использовать аргумент --format
. Любой из них позволит вам также удалить -P
.
Вы можете заменить эту часть команды wget
: 2>&1 1>/dev/null
на -q
. В любом случае у вас есть все, что было отменено. Правильный порядок будет >/dev/null 2>&1
.
Ответ 2
В Mac OS X:
xargs: макс. процессы должны быть > 0 (для: xargs -P [ > 0])
f() { echo "[[email protected]]"; }
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 "[email protected]"' arg0 '{}'
Ответ 3
Если вы устанавливаете GNU Parallel в другой системе, вы увидите, что функциональность находится в одном файле (называемом параллельным).
Вы можете просто скопировать этот файл в свой собственный ~/bin.