Como detectar que todos os processos filhos iniciados em um script terminaram?

2

Eu queria lançar vários comandos em paralelo usando um for loop, cada comando pode demorar mais ou menos tempo, e eu quero chamar outro comando no final do script. Aqui está um exemplo mínimo:

#!/bin/bash

function test {
    length=$1
    sleep $length

    echo "$length"
    echo "-----"
}

# http://www.cyberciti.biz/faq/bash-for-loop-array/    
array=( 5 1 3 )

for time in "${array[@]}"
do
    test $time &
done

Aqui está o resultado:

$ bash ~/test.sh && echo "OK"
OK
$ 1
-----
3
-----
5
-----

Como você pode ver, OK é exibido antes do script terminar, isso é lógico, pois chamei test em segundo plano com & . Não consigo adicionar um teste na última chamada test , uma vez que pode terminar antes das outras chamadas. Eu gostaria que o script fosse encerrado somente quando todas as test instâncias atendidas em background terminassem.

Aqui está o resultado que estou tentando obter:

$ bash ~/test.sh && echo "OK"
1
-----
3
-----
5
-----
OK
$ 

Como posso obter este resultado?

    
por A.L 23.09.2015 / 18:39

1 resposta

4

Você precisa aguardar após o loop for , portanto, processos filho atualmente ativos são esperados para:

for time in "${array[@]}"
do
    test "$time" &
done

wait
    
por 23.09.2015 / 18:52