コマンドから分岐したすべてのプロセスが完了するのを待つことはできますか?

コマンドから分岐したすべてのプロセスが完了するのを待つことはできますか?

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

おすすめ記事