명령에서 분기된 모든 프로세스가 완료될 때까지 기다릴 수 있나요?

명령에서 분기된 모든 프로세스가 완료될 때까지 기다릴 수 있나요?

FOO star BAR을 백그라운드에서 실행한다고 가정해 보겠습니다. BAR이 셸에서 완료될 때까지 어떻게 기다릴 수 있나요? 나는 FOO의 내부를 변경하지 않는 솔루션을 원합니다(마지 못해 BAR을 변경할 수는 있지만).

FOO

# Somehow wait on all forked processes of FOO

echo FOO and BAR have finished.

추신: 제가 염두에 두고 있는 특정 사용 사례는 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

관련 정보