Como posso esperar por todos os processos filhos, exceto um, para concluir a execução?

2

Estou iniciando vários processos no plano de fundo do script que estou escrevendo. Eu quero esperar por alguns deles para terminar antes do final de cada iteração de um loop for, mas há um processo que eu preciso deixar em execução e terminar em separado. O que eu estou fazendo agora não funciona porque pareço ficar sem memória, e mais e mais processos são sacrificados, incluindo o script que estou executando. O que eu tenho atualmente é:

loadAvg &
pid=$!
echo "LA pid $pid"
for (( j=0; j < $units_to_fill; j=$((j+1)) )); do
    #Print all files in dir | shuffle file names | delete 1st 1024 files found
    if [ $from_zero -ne 1 ];then
        stat -c %n * | sort -rz | awk -v n=0 '/file_[0-9]*_[abcd].bin/ { if( ++n <= 1024) {print $1 ; }}' | xargs -r rm -f
    fi
    echo "Creating file $j"
    pids=$(writeFile "file_${j}.bin" $src_file $block_size $block_count "${wd}/${dd_log_file}") #Writes a file of (dd) block size 1MB, with 1024 blocks
    for job in 'jobs -p'; do
        if [[ $job -ne $pid ]]; then
            echo "Waiting for $job"             
            wait $job
        fi
    done
done
kill $pid

A função writeFile gera vários processos filhos e não posso garantir a ordem em que eles sairão, já que eu estava fazendo wait $! no lugar do

for job in 'jobs -p'

Eu posso capturar os pids dos processos filhos que são gerados na função, e eles estão sendo retornados em um formato que é essencialmente pid1 pid2 pid3 ... , mas a execução de wait $pids não funciona como alguns dos processos anteriores essa linha é alcançada, então wait erros.

Nota: Estou rodando em um sistema embarcado com o busybox linux instalado e, como tal, tem sido bastante reduzido e muitas funções padrão estão indisponíveis.

    
por Yann 11.11.2014 / 15:11

1 resposta

3

O comando wait pode receber vários argumentos e aguardará a saída de todos esses processos. Então coloque todos os PIDs que você quer esperar em um array no loop, e então use:

wait ${pids[@]}

após o loop.

    
por 11.11.2014 / 20:51