Exécution de programmes en parallèle à l’aide de xargs

J’ai actuellement le script actuel.

#!/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 ce qui précède ne s’exécute qu’une fois à la fois. Pas de chance avec -n8 aussi. Ajouter et à la fin de la ligne à exécuter dans le script pour la boucle essaierait d’exécuter le script 99 fois de suite. Comment puis-je exécuter la boucle seulement 8 à la fois, jusqu’à 100 au total.

De la page de manuel de xargs :

Cette page de manuel documente la version GNU de xargs. xargs lit les éléments de l’entrée standard, délimités par des espaces (pouvant être protégés par des guillemets simples ou doubles ou une barre oblique inverse) ou des nouvelles lignes, et exécute la commande (par défaut / bin / echo) une ou plusieurs fois avec des arguments initiaux suivis par éléments lus à partir de l’entrée standard. Les lignes vides sur l’entrée standard sont ignorées.

Ce qui signifie que pour votre exemple, xargs attend et collecte toutes les sorties de votre script, puis exécute echo . Pas tout à fait utile ni ce que vous vouliez.

L’argument -n indique combien d’éléments de l’entrée à utiliser avec chaque commande est exécutée (rien en soi sur le parallélisme ici).

Pour faire ce que vous voulez avec xargs vous devez faire quelque chose de plus (non testé):

 printf %s\\n {0..99} | xargs -n 1 -P 8 script-to-run.sh input/ output/ 

Ce qui tombe en panne comme ça.

  • printf %s\\n {0..99} – Imprime un nombre par ligne de 0 à 99 .
  • Exécuter xargs
    • en prenant au plus un argument par ligne de commande d’exécution
    • et exécuter jusqu’à huit processus à la fois

Avec GNU Parallel, vous feriez:

 parallel script-to-run.sh input/ output/ {} ::: {0..99} 

Ajoutez -P8 si vous ne souhaitez pas exécuter un travail par cœur de processeur.

En face de xargs il fera The Right Thing, même si l’entrée contient de l’espace, “ou” (ce n’est pas le cas ici). Cela permet également de s’assurer que les sorties des différents travaux ne sont pas mélangées, donc si vous utilisez la sortie sont garantis que vous n’obtiendrez pas une demi-ligne de deux emplois différents.

GNU Parallel est un paralléliseur général et il est facile d’exécuter des tâches en parallèle sur la même machine ou sur plusieurs machines auxquelles vous avez access.

Si vous avez 32 tâches différentes à exécuter sur 4 processeurs, la méthode de parallélisation consiste à exécuter 8 tâches sur chaque CPU:

Programmation simple

Au lieu de cela, GNU Parallel crée un nouveau processus à la fin – gardant les processeurs actifs et économisant ainsi du temps:

Planification parallèle GNU

Installation

Si GNU Parallel n’est pas fourni pour votre dissortingbution, vous pouvez effectuer une installation personnelle, qui ne nécessite aucun access root. Cela peut être fait en 10 secondes en faisant ceci:

 (wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash 

Pour d’autres options d’installation, voir http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Apprendre encore plus

Voir plus d’exemples: http://www.gnu.org/software/parallel/man.html

Regardez les vidéos d’introduction: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Parcourez le tutoriel: http://www.gnu.org/software/parallel/parallel_tutorial.html

Inscrivez-vous à la liste de diffusion pour obtenir de l’aide: https://lists.gnu.org/mailman/listinfo/parallel