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?
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:
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-parallel
manuel pour plus de détails):
parallel "sortstuff.sh -a {} > {//}/sortedstuff-{/}" <live_hosts
>
par | tee
exemple la première commande devient parallel "sortstuff.sh -a {} | tee sortedstuff-{}" <live_hosts
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 parallel
commande pour l'appeler serait:
parallel wrapper.sh < live_hosts
Notez que vous n'avez pas besoin cat
de ce genre de chose, qui enregistre un appel de programme externe.
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
parallel
cependant, il facilite la gestion de certains aspects; vous pouvez limiter plus facilement le nombre de travaux exécutés en parallèle.
wc -l live_hosts
le 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 parallel
limiter le nombre de tâches n'est pas seulement agréable, elle est presque essentielle, si la vitesse de traitement est votre objectif.
tee
avecparallel
lors de la mise en sortiesortedstuff
? Je peux donc voir la sortie au fur et à mesure.