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.
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.
Tags busybox shell-script