Bash – lancer des traitements en parallèlle

Par défaut, le bash exécute les opérations les unes à la suite des autres. Par exemple, si j’écris un programme qui ressemble à ça :

#!/bin/bash
instruction1
instruction2
instruction3

et que je lance ce programme, il va d’abord exécuter instruction1, attendre la fin de cette instruction, puis lancer instruction2, etc…

L’objectif est de pouvoir lancer tous ces traitements en même temps.

Il existe la méthode suivante :

#!/bin/bash
instruction1 & instruction2 & instruction3

qui va lancer toutes les instructions en même temps.

Attention, il s’agit d’un simple &, et non pas un double ( && ) qui lui exécute un enchaînement conditionnel : il lance instruction1, attend la fin de son exécution, et lance instruction uniquement instruction1 se termine par un succès (par défaut, un code retour 0)

Cette méthode a un inconvénient majeur. Si les instructions sont générées automatiquement, et qu’il y en a un grand nombre, elles vont toutes se lancer en même temps, en mettant en péril la stabilité du système. Nous allons donc chercher à lancer plusieurs instructions simultanées, mais tout en limitant leur nombre.

Méthode conseillée :

En prérequis, nous devons avoir un fichier contenant toutes les instructions à lancer. Ce fichier peut contenir autant d’instructions que nécessaires. Nous allons ensuite lire ce fichier, et passer son contenu à la commande xargs. Supposons que nous avons stocké le nom du fichier dans la variable $TEMPCMD

while read cmd; do echo $cmd; done < $TEMPCMD | xargs -I CMD -n1 -P5 bash -c CMD

Cette commande va lire le fichier correspondant à $TEMPCMD, puis passer tous les arguments à xargs, qui va lui même les passer à bash ( arguments bash -c CMD ), sans arguments ( -n1 ), en lui demandant de n’en traiter que 5 en même temps ( -P5 ) . C’est xargs qui va s’assurer que tous les traitements demandés soient exécutés, tout en prenant soin qu’il n’y en ait que 5 actifs simultanément.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.