
Tento criar um script de shell para iniciar uma série de processos de longa duração. Vamos chamá-los de a, b, c, d e e. Os processos b, c e d devem ser executados em paralelo, e o processo e deve ser executado após todos os anteriores terem terminadocom sucesso.
Aí está 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 é que, se algum de b, c, d falhar, o script continua e executa e. Existe uma maneira de evitar isso?
Muito obrigado por qualquer resposta!
Antônio
Responder1
{
(echo "starting b"; b)&
(echo "starting c"; c)&
(echo "starting d"; d)&
wait %1 && wait %2 && wait %3
}&&
ao esperar por um trabalho específico wait
retorna o código de saída deste trabalho
Para entender, veja estes dois exemplos:
apenas 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
Responder2
Ao executar um processo em segundo plano, você basicamente disse ao shell que não está interessado em seu sucesso ou fracasso.
wait
vaireporte o valor de qualquer sinal em seu código de saída, se for o caso. Isto não é o que você está procurando.
Uma solução seria fazer com que cada comando relatasse seu status para stdout e contasse 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
}