Execute comandos em paralelo e aguarde até que um grupo de comandos termine antes de iniciar o próximo

4

Eu tenho script incluindo vários comandos. Como posso agrupar comandos para executar juntos (eu quero fazer vários grupos de comandos. Dentro de cada grupo, os comandos devem ser executados em paralelo (ao mesmo tempo). Os grupos devem executar sequencialmente, aguardando que um grupo termine antes de iniciar o próximo grupo) ... i.e.

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

como posso executar todos os 3 comandos? Eu tentei:

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

Mas isso não funcionou corretamente (eu quero executar os grupos de comandos em paralelo ao mesmo tempo. Também preciso esperar que o primeiro grupo termine antes de executar o próximo grupo)

O script está saindo com uma mensagem de erro!

    
por RobertL 10.11.2015 / 11:58

2 respostas

8

Os comandos dentro de cada grupo são executados em paralelo, e os grupos são executados sequencialmente, cada grupo de comandos paralelos esperando que o grupo anterior termine antes de iniciar a execução.

O seguinte é um exemplo de trabalho:

Suponha 3 grupos de comandos como no código abaixo. Em cada grupo, os três comandos são iniciados em segundo plano com & .

Os 3 comandos serão iniciados quase ao mesmo tempo e serão executados em paralelo, enquanto o script waits será concluído.

Depois que todos os três comandos no terceiro grupo saírem, command 10 será executado.

$ 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
$   
    
por 10.11.2015 / 12:05
1
{
command #1
command #2
command #3
} & 
{   
command #4
command #5
command #6
} & 
{
command #7
command #8
command #9
}&
command #10
wait #<===

Deve funcionar (cada componente triplet individual será executado sequencialmente, mas os grupos serão executados em paralelo). Você provavelmente não quer que seu shell pai saia antes que os grupos tenham terminado - daí o wait .

    
por 10.11.2015 / 12:03