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?
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:
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-parallel
manuale per i dettagli):
parallel "sortstuff.sh -a {} > {//}/sortedstuff-{/}" <live_hosts
>
con | tee
es. Il primo comando diventa parallel "sortstuff.sh -a {} | tee sortedstuff-{}" <live_hosts
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 parallel
comando per chiamarlo sarebbe:
parallel wrapper.sh < live_hosts
Si noti che non è necessario cat
per questo tipo di cose, che salva una chiamata al programma esterno.
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
parallel
rende più semplice la gestione di alcuni aspetti; è possibile limitare più facilmente il numero di lavori in esecuzione in parallelo.
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 parallel
limitare il numero di lavori non è solo piacevole, è quasi essenziale, se la velocità di elaborazione è il tuo obiettivo.
tee
conparallel
quando mettere l'output insortedstuff
? Quindi posso vedere l'output mentre procede.