Est-ce la bonne façon de démarrer plusieurs traitements séquentiels en arrière-plan?
for i in {1..10}; do
for j in {1..10}; do
run_command $i $j;
done &
done;
Tous j
doivent être traités les uns après les autres pour un certain temps i
, mais tous i
doivent être traités simultanément.
bash
background-process
for
parallelism
Controlé par radio
la source
la source
Réponses:
La boucle extérieure que vous avez est essentiellement
Cela démarrerait dix instances simultanées de
some_compound_command
l'arrière-plan. Ils seront lancés le plus rapidement possible, mais pas tout à fait "tous en même temps" (c'est-à-dire que si celasome_compound_command
prend très peu de temps, alors le premier peut bien finir avant que le dernier ne commence).Le fait qu'il
some_compound_command
s'agisse d'une boucle n'est pas important. Cela signifie que le code que vous montrez est correct dans la mesure où les itérations de laj
boucle interne s'exécuteront séquentiellement, mais toutes les instances de la boucle interne (une par itération de lai
boucle externe ) seront démarrées simultanément.La seule chose à garder à l'esprit est que chaque tâche d'arrière-plan s'exécutera dans un sous-shell. Cela signifie que les modifications apportées à l'environnement (par exemple, les modifications des valeurs des variables shell, les modifications du répertoire de travail actuel avec
cd
, etc.) dans une instance de la boucle interne ne seront pas visibles en dehors de ce travail d'arrière-plan particulier.Ce que vous voudrez peut-être ajouter est une
wait
instruction après votre boucle, juste pour attendre que tous les travaux en arrière-plan se terminent réellement, au moins avant la fin du script:la source
Si vous avez GNU Parallel, vous feriez:
L'un des avantages est que la sortie de l'exécution parallèle
run_commands
ne se mélangera pas.la source