![コマンドから分岐したすべてのプロセスが完了するまで待つことはできますか?](https://rvso.com/image/168810/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%8B%E3%82%89%E5%88%86%E5%B2%90%E3%81%97%E3%81%9F%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%8C%E5%AE%8C%E4%BA%86%E3%81%99%E3%82%8B%E3%81%BE%E3%81%A7%E5%BE%85%E3%81%A4%E3%81%93%E3%81%A8%E3%81%AF%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%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