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.