Execute comandos em paralelo e aguarde a conclusão de um grupo de comandos antes de iniciar o próximo

12

Eu tenho script incluindo vários comandos. Como agrupar comandos para execução em conjunto (quero criar vários grupos de comandos. Em cada grupo, os comandos devem ser executados em paralelo (ao mesmo tempo).) Os grupos devem ser executados sequencialmente, aguardando a conclusão de um grupo antes de iniciar o próximo grupo) ... ie

#!/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 a cada 3 comandos para obter? 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 (quero executar os grupos de comandos em paralelo ao mesmo tempo. Também preciso aguardar o primeiro grupo terminar antes de executar o próximo grupo)

O script está saindo com uma mensagem de erro!

RobertL
fonte
2
Como assim, corram juntos. Você quer dizer correr em paralelo ao mesmo tempo? Como você sabe que "não funcionou corretamente?" Como você saberá quando funciona corretamente? Deseja esperar o primeiro grupo terminar antes de executar o próximo grupo?
RobertL
@ RobertL.Yes, quero dizer em paralelo ao mesmo tempo. O script está saindo com uma mensagem de erro. Sim, preciso aguardar o término do primeiro grupo antes de executar o próximo grupo.
1
@goro citando você, o script está saindo com uma mensagem de erro. Edite sua pergunta para adicionar essa mensagem (para fins de conclusão) e remova o bate-papo (conselhos apreciados).
Dave_alcarin
É o mesmo comando em execução em cada instância? Mesmo nome?
RobertL
1
@ goro, isso é preciso? "Você tem vários grupos de comandos. Dentro de cada grupo, os comandos devem ser executados em paralelo (ao mesmo tempo). Os grupos devem ser executados sequencialmente, aguardando a conclusão de um grupo antes de iniciar o próximo grupo."
RobertL

Respostas:

20

Os comandos dentro de cada grupo são executados em paralelo e os grupos são executados seqüencialmente, cada grupo de comandos paralelos aguardando a conclusão do grupo anterior antes de iniciar a execução.

A seguir, é apresentado um exemplo de trabalho:

Assuma 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 executados em paralelo enquanto o script waitsfor concluído.

Após a saída de todos os três comandos no terceiro grupo, command 10será 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
$   
RobertL
fonte
Eu acho que os caracóis são totalmente sem sentido no seu exemplo, no entanto. A espera é global do processo e, neste caso, os grupos enrolados não criarão um novo fork.
PSKocik
1
@PSkocik, True. Órgãos vestigiais.
RobertL
6
{
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 tripleto individual será executado sequencialmente, mas os grupos hte serão executados em paralelo). Você provavelmente não deseja que o shell pai saia antes que os grupos terminem - daí o wait.

PSkocik
fonte
2
A pergunta original dizia apenas "executar a cada 3 comandos juntos". Sem esclarecimentos, qualquer uma das respostas está correta. Boa chamada no wait.
RobertL