pare todos os processos filhos quando 1 de, em seguida, retornar o código de saída 1

1

Eu tenho 2 ou mais processos de construção para serem executados em segundo plano. Eu quero parar todos os processos de construção se um deles sair com código diferente de 0.

./build-1.sh &
./build-2.sh &
./build-3.sh &
wait
#other steps

Atualmente, uso wait , que precisará aguardar todos os processos para concluir. Mas se um deles falhou, eu quero parar todos os outros builds. Como faço isso?

    
por Darwin Gautalius 22.07.2014 / 06:44

1 resposta

0

O que você está procurando é comumente chamado de named pipe e é usado para comunicação entre processos (IPC). Existem alguns ótimos docs sobre a criação de pipes nomeados no Bash, então deixarei para você escrever o código para isso.

Uma vez que você tenha um pipe nomeado, você poderia fazer algo como escrever o PID de cada um dos processos no pipe (usando a variável especial Bash $$ para o PID atual), e então cada um em um loop verificando a existência de cada um dos PIDs. se encontrar um que não exista mais (o processo morreu ou foi morto), então pode tomar uma ação.

Você colocaria algo assim na seção apropriada do (s) seu (s) script (s). Por favor, teste primeiro. :)

trap "rm -f $named_pipe" EXIT

# Assuming you have a file under $named_pipe with space-delimited PIDs
pids = $(< $named_pipe)
while :
do
  for pid in pids:
  do 
    if ! kill -0 $pid;
    then
      exit
    fi
  done
done
    
por 22.07.2014 / 08:46