Могу ли я дождаться завершения всех ответвленных процессов из команды?

Могу ли я дождаться завершения всех ответвленных процессов из команды?

Предположим, что запуск FOO запускает BAR в фоновом режиме. Как мне дождаться завершения BAR в оболочке? Мне нужно решение, при котором я не буду менять внутренности FOO (хотя я могу неохотно изменить BAR).

FOO

# Somehow wait on all forked processes of FOO

echo FOO and BAR have finished.

PS: Конкретный вариант использования, который я имею в виду, — это ожидание скрипта, который запускает Aria2, —-on-download-completeно мне хотелось бы иметь возможность решить эту проблему как можно более общим образом.

решение1

Вы можете заставить BAR выводить свой PID в файл; затем проверять, пока процесс с этим PID больше не будет запущен. Что-то вроде этого:

на BAR.sh:

#!/bin/bash
(echo $$)>/tmp/BAR.pid
...

на runFOO.sh:

#!/bin/bash
# possibly remove pid from previous run:
if [ -f /tmp/BAR.pid ]; then
  rm /tmp/BAR.pid
fi

# launch FOO
./FOO.sh &

# make sure BAR has started:
while [ ! -f /tmp/BAR.pid ]; do
  sleep 1
done

# wait for BAR to finnish: 
while [ $(kill -s 0 $( cat /tmp/BAR.pid ) 2>&1 | wc -l) -eq 0 ]; do
  sleep 1;
done

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