Итак, у меня есть цикл 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? Таким образом, я могу видеть результат, как он идет.