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.