Сценарии Shell: Используя xargs для выполнения подобных случаев функции оболочки

Я пытаюсь использовать 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, у меня просто нет полномочия установить программное обеспечение, где я пишу это.

12
задан Gnats 23 July 2010 в 19:33
поделиться

3 ответа

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

$ 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.

12
ответ дан 2 December 2019 в 21:22
поделиться

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

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

0
ответ дан 2 December 2019 в 21:22
поделиться

В 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 '{}'
1
ответ дан 2 December 2019 в 21:22
поделиться