web-dev-qa-db-fra.com

Commandes d'exécution en parallèle et attendez qu'un groupe de commandes se termine avant de commencer la prochaine

J'ai un script, y compris plusieurs commandes. Comment puis-je regrouper des commandes à exécuter ensemble (je veux faire 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 attente de la fin d'un groupe avant de commencer Groupe suivant) ... c'est-à-dire.

#!/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 à assembler? 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. De plus, j'ai besoin d'attendre le premier groupe à terminer avant d'exécuter le groupe suivant)

Le script quitte avec un message d'erreur!

12
user88036

Les commandes de chaque groupe exécutées en parallèle et les groupes fonctionnent de manière séquentielle, chaque groupe de commandes parallèles attendant que le groupe précédent puisse terminer avant de commencer l'exécution.

Ce qui suit est un exemple de travail:

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

Les 3 commandes seront démarrées presque simultanément et exécutées en parallèle tandis que le script waits pour eux à la fin.

Après les trois commandes de la troisième sortie de groupe, command 10 sera exécuté.

$ 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
$   
20
RobertL
{
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 de triplet individuellement fonctionnera séquentiellement, mais les groupes HTE seront exécutés en parallèle). Vous ne voulez probablement pas que votre coquille de parent quitte avant la fin des groupes - d'où le wait.

6
PSkocik