![остановить все дочерние процессы, когда 1 из них вернул код выхода 1](https://rvso.com/image/1416383/%D0%BE%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20%D0%B2%D1%81%D0%B5%20%D0%B4%D0%BE%D1%87%D0%B5%D1%80%D0%BD%D0%B8%D0%B5%20%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D1%8B%2C%20%D0%BA%D0%BE%D0%B3%D0%B4%D0%B0%201%20%D0%B8%D0%B7%20%D0%BD%D0%B8%D1%85%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D0%BB%20%D0%BA%D0%BE%D0%B4%20%D0%B2%D1%8B%D1%85%D0%BE%D0%B4%D0%B0%201.png)
У меня есть 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