Il existe toute une liste de programmes qui peuvent exécuter des tâches en parallèle à partir d'un shell, qui inclut même des comparaisons entre eux, dans la documentation de GNU parallel. Il existe de très nombreuses solutions. Une autre bonne nouvelle est qu'ils sont probablement assez efficaces pour planifier les tâches afin que tous les cœurs/processeurs soient occupés à tout moment.
Pour que les choses fonctionnent en parallèle, vous utilisez '&' à la fin d'une commande shell pour l'exécuter en arrière-plan, puis wait
attendra par défaut (c'est-à-dire sans arguments) que tous les processus d'arrière-plan soient terminés. Alors, lancez peut-être 10 en parallèle, puis attendez, puis faites-en dix autres. Vous pouvez le faire facilement avec deux boucles imbriquées.
Une autre façon très pratique de le faire est d'utiliser gnu parallel, qui vaut la peine d'être installé si vous ne l'avez pas déjà; c'est inestimable si les tâches ne prennent pas nécessairement le même temps.
seq 1000 | parallel -j 8 --workdir $PWD ./myrun {}
lancera ./myrun 1
, ./myrun 2
, etc., en s'assurant que 8 tâches sont en cours d'exécution à la fois. Il peut également prendre des listes de nœuds si vous souhaitez exécuter sur plusieurs nœuds à la fois, par exemple dans un travail PBS; nos instructions à nos utilisateurs pour savoir comment faire cela sur notre système sont ici.
Mise à jour pour ajouter : Vous voulez vous assurer que vous utilisez gnu-parallel, et non l'utilitaire plus limité du même nom fourni dans le paquet moreutils (l'historique divergent des deux est décrit ici.)
Découvrez les sous-shells bash, ceux-ci peuvent être utilisés pour exécuter des parties d'un script en parallèle.
Je n'ai pas testé cela, mais cela pourrait être un début :
#!/bin/bash
for i in $(seq 1 1000)
do
( Generating random numbers here , sorting and outputting to file$i.txt ) &
if (( $i % 10 == 0 )); then wait; fi # Limit to 10 concurrent subshells.
done
wait