Tarefa de primeiro plano em segundo plano e executando tarefas em paralelo

2

Como sou novo no Linux, peço desculpas se não estou usando a terminologia correta.

Estou tentando executar várias tarefas em paralelo (usando o operador shell de plano de fundo). No entanto, primeiro preciso executar duas tarefas em paralelo, seguidas (somente após a conclusão) pelo restante das tarefas que dependem do resultado das duas primeiras.

Por exemplo, suponha que as tarefas A.1 e A.2 possam ser executadas em paralelo (sem dependência entre elas) e produzir alguns arquivos que serão usados pelas tarefas B.1 , B.2 e B.3 . Todas as tarefas B são independentes; no entanto, eles não podem iniciar até que A.1 e A.2 sejam concluídos para ver os arquivos. Com isso em mente, criei os seguintes shell scripts:

script1 tem as seguintes linhas:

./A.1 & 
./A.2 &

script2 tem as seguintes linhas:

./B.1 &
./B.2 &
./B.3 &

script3 simplesmente chama os scripts 1 e 2 sequencialmente (ou seja, sem o operador & ) da seguinte forma:

./script1
./script2

Não tenho certeza se script3 é o que estou procurando. Eu estou fazendo a coisa certa? Em outras palavras, script2 esperará até que script1 termine e comece?

    
por rak 21.09.2015 / 03:11

1 resposta

2

Não, isso não vai fazer o que você quer. Mas na verdade é mais simples que isso.

Antes de mais nada, em um nível simples, sua análise está correta. Se script3 disser

./script1
./script2

então, sim, script3 esperará que script1 seja concluído, e então iniciará script2 . O problema é que script1 irá "terminar" essencialmente imediatamente - ou seja, no tempo necessário para gerar os dois processos A - e assim os comandos B serão iniciados enquanto os comandos A ainda estão em execução. Não é o que você quer.

A solução é

./A.1 &
./A.2 &
wait
./B.1 &
./B.2 &
./B.3 &

O comando wait (como o próprio nome sugere) aguarda que os processos assíncronos existentes sejam encerrados antes de continuar.

O comando wait deve ser executado pelo mesmo shell que gerou os processos A . Você poderia colocar todos os seis comandos em um único script, ou os três primeiros em um e os três últimos em outro, ou várias outras combinações.

Além disso, talvez você queira fazer um wait depois dos comandos B também.

    
por 21.09.2015 / 03:50