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?

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

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.


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.