
У меня есть 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