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-parallelmanuale per i dettagli):
parallel "sortstuff.sh -a {} > {//}/sortedstuff-{/}" <live_hosts
>con | teees. 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 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.
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.
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.
teeconparallelquando mettere l'output insortedstuff? Quindi posso vedere l'output mentre procede.