![pare todos os processos filhos quando 1 deles retornar o código de saída 1](https://rvso.com/image/1416383/pare%20todos%20os%20processos%20filhos%20quando%201%20deles%20retornar%20o%20c%C3%B3digo%20de%20sa%C3%ADda%201.png)
Tenho 2 ou mais processos de construção para serem executados em segundo plano. Quero interromper 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, utilizo wait
o qual precisará aguardar a finalização de todos os processos. Mas se um deles falhar, quero interromper todas as outras construções. Como eu faço isso?
Responder1
O que você está procurando é comumente chamado de named pipe
e é usado para comunicação entre processos (IPC). Existem muitos documentos excelentes sobre a criação de pipes nomeados no Bash, então deixarei que você escreva o código para isso.
Depois de ter um pipe nomeado instalado, você pode fazer algo como escrever o PID de cada um dos processos no pipe (usando a variável especial Bash $$
para o PID atual) e, em seguida, fazer com que cada um fique em um loop verificando a existência de cada um dos PID. se encontrar um que não exista mais (o processo morreu ou foi morto), ele poderá executar 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