Итак, у меня есть цикл while:
cat live_hosts | while read host; do \
sortstuff.sh -a "$host" > sortedstuff-"$host"; done
Но это может занять много времени. Как бы я использовал GNU Parallel для этого цикла while?
Итак, у меня есть цикл while:
cat live_hosts | while read host; do \
sortstuff.sh -a "$host" > sortedstuff-"$host"; done
Но это может занять много времени. Как бы я использовал GNU Parallel для этого цикла while?
Ответы:
Вы не используете цикл while.
parallel "sortstuff.sh -a {} > sortedstuff-{}" <live_hosts
Обратите внимание, что это не будет работать, если у вас есть пути в вашем live_hosts
(например /some/dir/file
), поскольку он расширится до sortstuff.sh -a /some/dir/file > sortedstuff-/some/dir/file
(в результате no such file or directory
); для этих случаев используйте {//}
и {/}
(см. gnu-parallel
руководство для деталей):
parallel "sortstuff.sh -a {} > {//}/sortedstuff-{/}" <live_hosts
>
с , | tee
например , первая команда становится parallel "sortstuff.sh -a {} | tee sortedstuff-{}" <live_hosts
Будучи старой школой, «делай одно и делай это хорошо», парень из Unix, я бы поместил материал для подстановки строк в скрипт-обертку:
#!/bin/sh
sortstuff.sh -a "$1" > sortedstuff-"$1"
Если вы вызываете его wrapper.sh
, parallel
команда для вызова будет:
parallel wrapper.sh < live_hosts
Обратите внимание, что вам не нужны cat
такие вещи, которые сохраняют внешний вызов программы.
Вам не нужно parallel
, так как тело цикла не зависит от предыдущих итераций. Просто запустите новый фоновый процесс для каждого хоста.
while read host; do
sortstuff.sh -a "$host" > sortedstuff-"$host" &
done < live_hosts
wait # Optional, to block until the background tasks are done
parallel
облегчает управление некоторыми аспектами; Вы можете легче ограничить количество параллельных заданий.
wc -l live_hosts
это число превышает количество дисковых шпинделей или ядер ЦП - в зависимости от того, связана ли задача с вводом-выводом или с ЦП, - вы воспользуетесь преимуществом параллелизма с помощью такого решения. Возможность parallel
ограничить количество заданий не просто приятна, она практически необходима, если ваша цель - скорость обработки.
tee
сparallel
кладя выход вsortedstuff
? Таким образом, я могу видеть результат, как он идет.