
Предположим, что запуск 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