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