Come dovrei usare GNU Parallel per questo ciclo while?


12

Quindi ho un ciclo while:

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

Ma questo può richiedere molto tempo. Come dovrei usare GNU Parallel per questo ciclo while?

Risposte:


13

Non usi un ciclo while.

parallel "sortstuff.sh -a {} > sortedstuff-{}" <live_hosts

Nota che questo non funzionerà se hai dei percorsi nel tuo live_hosts(es. /some/dir/file) Come si espanderebbe in sortstuff.sh -a /some/dir/file > sortedstuff-/some/dir/file(risultante no such file or directory); per questi casi usare {//}e {/}(vedere il gnu-parallelmanuale per i dettagli):

parallel "sortstuff.sh -a {} > {//}/sortedstuff-{/}" <live_hosts

E 'possibile utilizzare teecon parallelquando mettere l'output in sortedstuff? Quindi posso vedere l'output mentre procede.
Proletariato il

1
@Proletariat: vuoi eseguire l'output anche al terminale? Basta sostituire >con | teees. Il primo comando diventa parallel "sortstuff.sh -a {} | tee sortedstuff-{}" <live_hosts
don_crissti

3

Come un vecchio stile "fai una cosa e fallo bene", ragazzo Unix, metterei le cose di sostituzione delle stringhe in uno script wrapper:

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

Se lo chiami wrapper.sh, il parallelcomando per chiamarlo sarebbe:

parallel wrapper.sh < live_hosts

Si noti che non è necessario catper questo tipo di cose, che salva una chiamata al programma esterno.


2

Non è necessario parallel , poiché il corpo del loop non dipende dalle iterazioni precedenti. Basta avviare un nuovo processo in background per ciascun host.

while read host; do
    sortstuff.sh -a "$host" > sortedstuff-"$host" &
done < live_hosts
wait    # Optional, to block until the background tasks are done

parallelrende più semplice la gestione di alcuni aspetti; è possibile limitare più facilmente il numero di lavori in esecuzione in parallelo.


3
Se wc -l live_hostsè superiore al numero di mandrini del disco o core della CPU - a seconda che l'attività sia I / O o legata alla CPU - perderai molto del vantaggio che ottieni dal parallelismo con una soluzione del genere. La capacità di parallellimitare il numero di lavori non è solo piacevole, è quasi essenziale, se la velocità di elaborazione è il tuo obiettivo.
Warren Young,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.