Mam więc pętlę while:
cat live_hosts | while read host; do \
sortstuff.sh -a "$host" > sortedstuff-"$host"; done
Ale może to zająć dużo czasu. Jak miałbym używać GNU Parallel do tej pętli while?
Mam więc pętlę while:
cat live_hosts | while read host; do \
sortstuff.sh -a "$host" > sortedstuff-"$host"; done
Ale może to zająć dużo czasu. Jak miałbym używać GNU Parallel do tej pętli while?
Odpowiedzi:
Nie używasz pętli while.
parallel "sortstuff.sh -a {} > sortedstuff-{}" <live_hosts
Zauważ, że to nie zadziała, jeśli masz ścieżki w swoim live_hosts
(np. /some/dir/file
), Ponieważ rozwinąłoby się do sortstuff.sh -a /some/dir/file > sortedstuff-/some/dir/file
(skutkując no such file or directory
); w tych przypadkach użyj {//}
i {/}
(patrz gnu-parallel
instrukcja w celu uzyskania szczegółowych informacji):
parallel "sortstuff.sh -a {} > {//}/sortedstuff-{/}" <live_hosts
>
z | tee
np pierwsze polecenie staje parallel "sortstuff.sh -a {} | tee sortedstuff-{}" <live_hosts
Jako oldschoolowy facet „zrób jedną rzecz i zrób to dobrze”, uniksowy facet, umieściłem substytucję ciągu znaków w skrypcie opakowania:
#!/bin/sh
sortstuff.sh -a "$1" > sortedstuff-"$1"
Jeśli go wywołasz wrapper.sh
, parallel
polecenie wywołania będzie następujące:
parallel wrapper.sh < live_hosts
Zauważ, że nie potrzebujesz cat
tego rodzaju rzeczy, które zapisują zewnętrzne wywołanie programu.
Nie potrzebujesz parallel
, ponieważ treść pętli nie zależy od poprzednich iteracji. Po prostu rozpocznij nowy proces w tle dla każdego hosta.
while read host; do
sortstuff.sh -a "$host" > sortedstuff-"$host" &
done < live_hosts
wait # Optional, to block until the background tasks are done
parallel
ułatwia jednak zarządzanie niektórymi aspektami; łatwiej można ograniczyć liczbę zadań uruchomionych równolegle.
wc -l live_hosts
jest większa niż liczba wrzecion dyskowych lub rdzeni procesora - w zależności od tego, czy zadanie dotyczy operacji we / wy, czy procesora - zużyjesz wiele korzyści wynikających z równoległości z takim rozwiązaniem. Możliwość parallel
ograniczenia liczby zadań jest nie tylko przyjemna, jest prawie niezbędna, jeśli Twoim celem jest szybkość przetwarzania.
tee
zparallel
wprowadzaniem danych wyjściowychsortedstuff
? Widzę więc, jak wygląda wyjście.