Estou tentando escrever um script bash que bifurca dois processos de servidor em segundo plano (cujo encerramento significa um problema), e esse script sairia assim que um deles terminasse (sem esperar pelo outro).
Aqui está o que eu tentei até agora:
Tentativa 1
wait
Usando a diretiva bash . Isso não funcionou porque ainda aguarda a conclusão de ambos os processos. No meu caso, estou executando dois processos de servidor, portanto, se eles forem concluídos, significa que algo está errado, portanto, devo sair desse script completamente.
#!/usr/bin/env bash
set -e
./server1 &
pid1="$!"
./server2 &
pid1="$!"
wait "$1"
wait "$2"
Tentativa 2
O mesmo que acima, mas apenas diga wait
sem especificar pid. Faz o mesmo comportamento.
...
pid2="$!"
wait
Tentativa 3
Eu tentei usar sub-shells e sair de lá. Mas o exit
se aplica apenas ao sub-shell, então ainda esperamos que ambos os processos em segundo plano terminem:
#!/usr/bin/env bash
set -e
( ./server1 || echo crash1; exit 1 ) &
( ./server2 || echo crash2; exit 2 ) &
wait
Existe uma maneira de conseguir isso (bifurcar dois processos do servidor em segundo plano e sair assim que um deles terminar) no bash?
De
help wait
dentrobash
:O uso
wait -n
aguardará o término do próximo trabalho. Isso significa que, se um de seus dois trabalhos em segundo plano for encerrado, a chamada parawait -n
retornará. Você obterá o status de saída desse trabalho como o status de saída dewait -n
, mas não saberá qual dos trabalhos foi encerrado.A
-n
opção parawait
foi adicionada embash-4.3-alpha
.