Comment utiliser GNU Parallel pour cette boucle while?

12

J'ai donc une boucle while:

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

Mais cela peut prendre du temps. Comment utiliser GNU Parallel pour cette boucle while?

Prolétariat
la source

Réponses:

13

Vous n'utilisez pas de boucle while.

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

Notez que cela ne fonctionnera pas si vous avez des chemins dans votre live_hosts(par exemple /some/dir/file) car cela se développerait sortstuff.sh -a /some/dir/file > sortedstuff-/some/dir/file(résultant en no such file or directory); pour ces cas, utilisez {//}et {/}(voir le gnu-parallelmanuel pour plus de détails):

parallel "sortstuff.sh -a {} > {//}/sortedstuff-{/}" <live_hosts
don_crissti
la source
Est-il possible d'utiliser teeavec parallellors de la mise en sortie sortedstuff? Je peux donc voir la sortie au fur et à mesure.
Prolétariat du
1
@Proletariat - vous voulez également sortir sur le terminal? Il suffit de remplacer >par | teeexemple la première commande devient parallel "sortstuff.sh -a {} | tee sortedstuff-{}" <live_hosts
don_crissti
3

En tant que type Unix de la vieille école "faites une chose et faites-le bien", je mettrais les trucs de substitution de chaînes dans un script wrapper:

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

Si vous l'appelez wrapper.sh, la parallelcommande pour l'appeler serait:

parallel wrapper.sh < live_hosts

Notez que vous n'avez pas besoin catde ce genre de chose, qui enregistre un appel de programme externe.

Warren Young
la source
2

Vous n'en avez pas besoin parallel , car le corps de la boucle ne dépend pas des itérations précédentes. Il suffit de démarrer un nouveau processus d'arrière-plan pour chaque hôte.

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

parallelcependant, il facilite la gestion de certains aspects; vous pouvez limiter plus facilement le nombre de travaux exécutés en parallèle.

chepner
la source
3
Si wc -l live_hostsle nombre de broches de disque ou de cœurs de processeur est supérieur au nombre - selon que la tâche est liée aux E / S ou au processeur - vous allez perdre beaucoup d'avantages que vous obtenez du parallélisme avec une solution comme celle-ci. La capacité de parallellimiter le nombre de tâches n'est pas seulement agréable, elle est presque essentielle, si la vitesse de traitement est votre objectif.
Warren Young