1

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

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

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

1 ответ1

0

То, что вы ищете, обычно называется 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .