Angenommen, FOO startet BAR im Hintergrund. Wie kann ich in der Shell warten, bis BAR fertig ist? Ich möchte eine Lösung, bei der ich die internen Komponenten von FOO nicht ändere (obwohl ich die von BAR widerwillig ändern kann).
FOO
# Somehow wait on all forked processes of FOO
echo FOO and BAR have finished.
PS: Der spezielle Anwendungsfall, der mir vorschwebt, ist das Warten auf das Skript, mit dem Aria2 ausgeführt wird, —-on-download-complete
aber ich möchte dies so allgemein wie möglich lösen können.
Antwort1
Sie können BAR veranlassen, seine PID in eine Datei auszugeben. Prüfen Sie dann, bis der Prozess mit dieser PID nicht mehr ausgeführt wird. Etwa so:
auf BAR.sh:
#!/bin/bash
(echo $$)>/tmp/BAR.pid
...
auf 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