Как бы я использовал GNU Parallel для этого цикла while?


12

Итак, у меня есть цикл while:

cat live_hosts | while read host; do \
    sortstuff.sh -a "$host" > sortedstuff-"$host"; done

Но это может занять много времени. Как бы я использовал GNU Parallel для этого цикла while?

Ответы:


13

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

1
@ Пролетариат - ты тоже хочешь выводить на терминал? Просто замените >с , | teeнапример , первая команда становится parallel "sortstuff.sh -a {} | tee sortedstuff-{}" <live_hosts
don_crissti

3

Будучи старой школой, «делай одно и делай это хорошо», парень из Unix, я бы поместил материал для подстановки строк в скрипт-обертку:

#!/bin/sh
sortstuff.sh -a "$1" > sortedstuff-"$1"

Если вы вызываете его wrapper.sh, parallelкоманда для вызова будет:

parallel wrapper.sh < live_hosts

Обратите внимание, что вам не нужны catтакие вещи, которые сохраняют внешний вызов программы.


2

Вам не нужно 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облегчает управление некоторыми аспектами; Вы можете легче ограничить количество параллельных заданий.


3
Если wc -l live_hostsэто число превышает количество дисковых шпинделей или ядер ЦП - в зависимости от того, связана ли задача с вводом-выводом или с ЦП, - вы воспользуетесь преимуществом параллелизма с помощью такого решения. Возможность parallelограничить количество заданий не просто приятна, она практически необходима, если ваша цель - скорость обработки.
Уоррен Янг
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.