![Могу ли я дождаться завершения всех ответвленных процессов из команды?](https://rvso.com/image/168810/%D0%9C%D0%BE%D0%B3%D1%83%20%D0%BB%D0%B8%20%D1%8F%20%D0%B4%D0%BE%D0%B6%D0%B4%D0%B0%D1%82%D1%8C%D1%81%D1%8F%20%D0%B7%D0%B0%D0%B2%D0%B5%D1%80%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B2%D1%81%D0%B5%D1%85%20%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D0%B2%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D0%B2%20%D0%B8%D0%B7%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%8B%3F.png)
Предположим, что запуск 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