Exécutez les commandes en parallèle et attendez la fin d'un groupe de commandes avant de commencer la suivante


12

J'ai un script comprenant plusieurs commandes. Comment regrouper des commandes à exécuter ensemble (je souhaite créer plusieurs groupes de commandes. Dans chaque groupe, les commandes doivent s'exécuter en parallèle (en même temps). Les groupes doivent s'exécuter séquentiellement, en attendant qu'un groupe se termine avant de démarrer le groupe suivant) ... ie

#!/bin/bash
command #1
command #2
command #3
command #4
command #5
command #6
command #7
command #8
command #9
command #10

comment puis-je exécuter toutes les 3 commandes ensemble? J'ai essayé:

#!/bin/bash
{
command #1
command #2
command #3
} & 
{   
command #4
command #5
command #6
} & 
{
command #7
command #8
command #9
}&
command #10

Mais cela n'a pas fonctionné correctement (je veux exécuter les groupes de commandes en parallèle en même temps. Je dois également attendre que le premier groupe se termine avant d'exécuter le groupe suivant)

Le script se termine avec un message d'erreur!


2
Que voulez-vous dire, courir ensemble. Voulez-vous dire courir en parallèle en même temps? Comment savez-vous que "cela n'a pas fonctionné correctement?" Comment saurez-vous que cela fonctionne correctement? Voulez-vous attendre la fin du premier groupe avant d'exécuter le groupe suivant?
RobertL

@ RobertL.Oui je veux dire en parallèle en même temps. Le script se termine avec un message d'erreur. Oui, je dois attendre la fin du troisième groupe avant d'exécuter le groupe suivant.

1
@goro vous cite, le script se termine avec un message d'erreur. Veuillez modifier votre question pour ajouter un tel message (pour le plaisir de terminer) et supprimer le chit-chat (conseils appréciés).
dave_alcarin

S'agit-il de la même commande exécutée dans chaque instance? Même nom?
RobertL

1
@goro, est-ce exact? "Vous avez plusieurs groupes de commandes. Au sein de chaque groupe, les commandes doivent s'exécuter en parallèle (en même temps). Les groupes doivent s'exécuter séquentiellement, en attendant qu'un groupe se termine avant de démarrer le groupe suivant."
RobertL

Réponses:


20

Les commandes de chaque groupe s'exécutent en parallèle et les groupes s'exécutent de manière séquentielle, chaque groupe de commandes parallèles attendant la fin du groupe précédent avant de démarrer l'exécution.

Voici un exemple pratique:

Supposons 3 groupes de commandes comme dans le code ci-dessous. Dans chaque groupe, les trois commandes sont lancées en arrière-plan avec &.

Les 3 commandes seront lancées presque en même temps et exécutées en parallèle pendant que le script waitsse termine.

Après les trois commandes du troisième groupe, la sortie command 10s'exécutera.

$ cat command_groups.sh 
#!/bin/sh

command() {
    echo $1 start
    sleep $(( $1 & 03 ))      # keep the seconds value within 0-3
    echo $1 complete
}

echo First Group:
command 1 &
command 2 &
command 3 &
wait

echo Second Group:
command 4 &
command 5 &
command 6 &
wait

echo Third Group:
command 7 &
command 8 &
command 9 &
wait

echo Not really a group, no need for background/wait:
command 10

$ sh command_groups.sh 
First Group:
1 start
2 start
3 start
1 complete
2 complete
3 complete
Second Group:
4 start
5 start
6 start
4 complete
5 complete
6 complete
Third Group:
7 start
8 start
9 start
8 complete
9 complete
7 complete
Not really a group, no need for background/wait:
10 start
10 complete
$   

Je pense que les curlies sont totalement dénués de sens dans votre exemple, cependant. L'attente est globale au processus et les groupes en boucle ne créeront pas de nouveau fork dans ce cas.
PSkocik

1
@PSkocik, True. Organes vestigiaux.
RobertL

6
{
command #1
command #2
command #3
} & 
{   
command #4
command #5
command #6
} & 
{
command #7
command #8
command #9
}&
command #10
wait #<===

Devrait fonctionner (chaque composant triplet individuel fonctionnera séquentiellement, mais les groupes hte fonctionneront en parallèle). Vous ne voulez probablement pas que votre shell parent se termine avant la fin des groupes - d'où le wait.


2
La question d'origine disait seulement "exécuter toutes les 3 commandes ensemble". Sans précision, l'une ou l'autre réponse est correcte. Bon appel au wait.
RobertL
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.