detener todos los procesos secundarios cuando 1 de ellos devuelva el código de salida 1

detener todos los procesos secundarios cuando 1 de ellos devuelva el código de salida 1

Tengo 2 o más procesos de compilación para ejecutar en segundo plano. Quiero detener todos los procesos de compilación si uno de ellos sale con un código distinto de 0.

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

Actualmente, uso waitel cual tendré que esperar a que finalicen todos los procesos. Pero si uno de ellos falló, quiero detener todas las demás compilaciones. ¿Cómo hago esto?

Respuesta1

Lo que estás buscando se llama comúnmente named pipey se utiliza para la comunicación entre procesos (IPC). Hay muchos documentos excelentes sobre la creación de canalizaciones con nombre en Bash, así que te dejaré a ti escribir el código para eso.

Una vez que tenga una tubería con nombre en su lugar, podría hacer algo como escribir el PID de cada uno de los procesos en la tubería (usando la variable especial Bash $$para el PID actual) y luego hacer que cada uno se siente en un bucle para verificar la existencia de cada uno de los PID. si encuentra uno que ya no existe (el proceso murió o fue eliminado), entonces puede realizar una acción.

Pondría algo como esto en la sección correspondiente de su(s) guión(s). Pruébelo primero. :)

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

información relacionada