остановить все дочерние процессы, когда 1 из них вернул код выхода 1

остановить все дочерние процессы, когда 1 из них вернул код выхода 1

У меня есть 2 или более процессов сборки для запуска в фоновом режиме. Я хочу остановить все процессы сборки, если один из них завершится с кодом, отличным от 0.

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

В настоящее время я использую, waitкоторый должен будет дождаться завершения всех процессов. Но если 1 из них даст сбой, я хочу остановить все остальные сборки. Как это сделать?

решение1

То, что вы ищете, обычно называется named pipeи используется для межпроцессного взаимодействия (IPC). Существует множество отличных документов о создании именованных каналов в Bash, поэтому я оставлю вам написание кода для этого.

После создания именованного канала вы можете сделать что-то вроде записи PID каждого процесса в канал (используя специальную переменную Bash $$для текущего PID), а затем заставить каждый процесс в цикле проверять существование каждого из PID. Если он обнаружит тот, который больше не существует (процесс завершился или был завершен), то он может предпринять действие.

Вы бы поместили что-то подобное в соответствующий раздел вашего скрипта(ов). Пожалуйста, сначала протестируйте это. :)

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

Связанный контент