Kann ich warten, bis alle gegabelten Prozesse eines Befehls abgeschlossen sind?

Kann ich warten, bis alle gegabelten Prozesse eines Befehls abgeschlossen sind?

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-completeaber 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

verwandte Informationen