Obtém código de saída de subshells que estão sendo executados em paralelo

4

Eu tento fazer um script de shell para iniciar uma série de processos de longo prazo. Vamos chamá-los de a, b, c, d e e. Os processos b, c e d devem rodar em paralelo, e o processo e deve ser executado após todos os anteriores terem terminado com sucesso .

Existe o meu (pseudo-) código:

{
    echo "starting a"
    a
}&&
{
    (echo "starting b"; b; exit $?)&
    (echo "starting c"; c; exit $?)&
    (echo "starting d"; d; exit $?)&
    wait
}&&
{
    echo "starting e"
    e
}

Meu problema é, se algum de b, c, d falhar, o script continua e executa e. Existe uma maneira de evitar isso?

Muito obrigado por qualquer resposta!

Antoine

    
por Antoine 14.08.2012 / 10:51

2 respostas

2

{
    (echo "starting b"; b)&
    (echo "starting c"; c)&
    (echo "starting d"; d)&
    wait %1 && wait %2 && wait %3
}&&

ao aguardar um trabalho específico wait retorna este código de saída de trabalhos

Para entender, veja estes dois exemplos:
somente a última linha é importante (mostra o status de saída de wait )

(sleep 3; false) & wait; echo $?
[1] 25358
[1]+  Exit 1                  ( sleep 3; false )
0

-

(sleep 3; false) & wait %1; echo $?
[1] 25362
[1]+  Exit 1                  ( sleep 3; false )
1
    
por 14.08.2012 / 11:25
0

Ao executar um processo em segundo plano, você basicamente disse ao shell que não está interessado em seu sucesso ou falha.

wait irá reportar o valor de qualquer sinal em seu código de saída, se isso se aplicar. Não é isso que você está procurando.

Uma solução seria fazer com que cada comando relatasse seu status para stdout e conte as respostas com grep.

{
  (echo "starting b"; b && echo ok)&
  (echo "starting c"; c && echo ok)&
  (echo "starting d"; d && echo ok)&
} | 
grep -c ok | ( read n && (( n==3 )) ) && 

{
echo "starting e"; e
}
    
por 14.08.2012 / 11:11

Tags