Saindo de um script de shell se certos processos filhos saírem

1

Eu tenho um script Bash que inicia um servidor web, faz algum trabalho e, em seguida, inicia um segundo servidor web. Eu gostaria que o script fosse encerrado, e para ambos os servidores terminarem, se o servidor sair ou o usuário digitar Ctrl + C .

O que eu tenho agora é assim:

start_server_1 &
server_1_pid=$!

trap "kill $server_1_pid" EXIT

# ...do some work that requires server 1 to be running...

start_server_2 || exit $?

Isso encerra corretamente os dois servidores se o usuário digitar Ctrl + C . Se o Servidor 1 sair, no entanto, o Servidor 2 e o próprio script continuarão a ser executados. Como posso ter certeza de que os dois servidores e o script serão removidos se um desses processos sair?

    
por bdesham 24.05.2016 / 15:26

1 resposta

1

Execute os dois processos em segundo plano e, em seguida, wait -n a aguardar para um deles sair.

Bash não informa qual processo foi encerrado, mas você pode executar jobs -p para obter a lista de trabalhos em segundo plano que ainda estão sendo executados e eliminá-los.

start_server_1 &
server_1_pid=$!
start_server_2 &
server_2_pid=$!
wait -n
kill $(jobs -p)

wait -n é novo no bash 4.3. Em versões mais antigas, isso é muito mais difícil.

Outros shells comuns não têm wait -n , mas eles permitem que você defina um trap em SIGCHLD e chame plain wait . No traço, ksh93, mksh e zsh, você pode escrever

trap 'kill $server_1_pid $server_2_pid; exit' CHLD
wait

Isso não funciona no bash porque a interceptação SIGCHLD só é invocada depois que todas as tarefas terminarem de ser executadas.

    
por 25.05.2016 / 01:52