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