Programmes en cours d'exécution en parallèle en utilisant xargs
J'ai actuellement le script courant.
#!/bin/bash
# script.sh
for i in {0..99}; do
script-to-run.sh input/ output/ $i
done
Je souhaite l'exécuter en parallèle en utilisant xargs. J'ai essayé
script.sh | xargs -P8
Mais faire la ci-dessus n'est exécutée une fois à l'heure. Pas de chance avec -n8 ainsi.
Ajout & à la fin de la ligne pour être exécuté dans le script de la boucle essayez d'exécuter le script, de 99 à la fois. Comment puis-je exécuter la boucle de seulement 8 à la fois, jusqu'à 100 au total.
- C'est ce que j'ai d'abord voulu faire, mais a dû recourir à xargs parce que je suis sur Windows. Je n'ai pas été en mesure d'obtenir GNU Parallèles s'exécutant sur Windows
- C'est que le script appelant lui-même ou avez-vous juste de confondre les noms quand vous avez demandé ici?
- Désolé, il doit appeler un autre script. Je vais le corriger
- La réponse à stackoverflow.com/questions/3321738/... est pertinente ici.
Vous devez vous connecter pour publier un commentaire.
De la
xargs
homme page:Ce qui signifie que, pour votre exemple
xargs
est en attente et la collecte de la totalité de la production à partir de votre script, puis en exécutantecho <that output>
. Pas exactement tout utile, ni ce que tu voulais.La
-n
argument est le nombre d'éléments à partir de l'entrée à utiliser avec chaque commande est exécuté (rien, par lui-même, sur le parallélisme ici).À faire ce que vous voulez avec
xargs
vous aurez besoin de faire quelque chose de plus comme cette (non testé):Qui se décompose comme ceci.
printf %s\\n {0..99}
- Imprimer un numéro par ligne de0
à99
.xargs
echo {0..99} |
pourrait fonctionner tout aussi bien.<<<{0..99}
ne semble pas fonctionner, bien que<<<word
est documenté comme brace-l'expansion de mot, il ne le fait pas avec n'importe quelle version de bash que j'ai à portée de main.<<
mais ne pour<<<
donc*shrug*
). Les extensions qui ne sont et ne se produit pas dans les docs ici et ici, les cordes sont un peu bizarre à mon esprit.Avec GNU Parallèle, vous feriez:
Ajouter dans
-P8
si vous ne pas souhaitez exécuter un travail par cœur de PROCESSEUR.En face de
xargs
, il va faire La bonne Chose, même si l'entrée contenir d'espace", ou " (pas le cas ici, tout de même). Il assure également la sortie à partir de différents travaux ne sont pas mélangés, de sorte que si vous utilisez la sortie vous avez la garantie que vous n'aurez pas une demi-ligne à partir de deux emplois différents.GNU Parallèle est un général parallelizer et est facile à exécuter des tâches en parallèle sur la même machine ou sur plusieurs machines, vous avez un accès ssh.
Si vous avez 32 les différents travaux que vous souhaitez exécuter sur 4 Processeurs, directement à la parallélisation consiste à exécuter 8 emplois sur chaque CPU:
GNU Parallèle au lieu de cela génère un nouveau processus quand on aura fini de maintien de la Cpu actifs et ainsi d'économiser le temps:
Installation
Si GNU Parallèle n'est pas emballé pour votre distribution, vous pouvez faire une installation personnelle, qui ne nécessite pas d'accès root. Il peut être fait dans les 10 secondes en faisant ceci:
Pour d'autres options d'installation voir http://git.savannah.gnu.org/cgit/parallel.git/tree/README
En savoir plus
Voir plus d'exemples: http://www.gnu.org/software/parallel/man.html
Regarder les vidéos d'intro: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
Promenade à travers le tutoriel: http://www.gnu.org/software/parallel/parallel_tutorial.html
Inscrire à la liste de courriel pour obtenir de l'assistance: https://lists.gnu.org/mailman/listinfo/parallel