Як я можу використовувати паралель GNU для цього циклу while?


12

Тож у мене є певний час:

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

Але це може зайняти тривалий час. Як я можу використовувати паралель GNU для цього циклу while?

Відповіді:


13

Ви не використовуєте цикл час.

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
@Proletariat - ви теж хочете вивести на термінал? Просто замініть >з , | 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.