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

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

FOO가 백그라운드에서 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

관련 정보