Тож у мене є певний час:
cat live_hosts | while read host; do \
sortstuff.sh -a "$host" > sortedstuff-"$host"; done
Але це може зайняти тривалий час. Як я можу використовувати паралель GNU для цього циклу while?
Тож у мене є певний час:
cat live_hosts | while read host; do \
sortstuff.sh -a "$host" > sortedstuff-"$host"; done
Але це може зайняти тривалий час. Як я можу використовувати паралель GNU для цього циклу 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
? Тож я бачу вихід, як він йде.