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 wait
el 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 pipe
y 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