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