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-complete
pero 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