¿Puedo esperar a que finalicen todos los procesos bifurcados de un comando?

¿Puedo esperar a que finalicen todos los procesos bifurcados de un comando?

Supongamos que ejecuta FOO stars BAR en segundo plano. ¿Cómo puedo esperar a que BAR termine en el shell? Quiero una solución en la que no cambie las partes internas de FOO (aunque puedo cambiar las de BAR a regañadientes).

FOO

# Somehow wait on all forked processes of FOO

echo FOO and BAR have finished.

PD: El caso de uso específico que tengo en mente es esperar el script que ejecuta Aria2, —-on-download-completepero me gusta poder resolver esto de la manera más general posible.

Respuesta1

Puede hacer que BAR envíe su PID a un archivo; luego verifique hasta que el proceso con ese PID ya no se esté ejecutando. Algo como esto:

en BAR.sh:

#!/bin/bash
(echo $$)>/tmp/BAR.pid
...

en 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

información relacionada