Eu tenho um monte de imagens PNG em um diretório. Eu tenho um aplicativo chamado pngout que eu corro para compactar essas imagens. Este aplicativo é chamado por um script que fiz. O problema é que esse script faz um de cada vez, algo assim:
FILES=(./*.png)
for f in "${FILES[@]}"
do
echo "Processing $f file..."
# take action on each file. $f store current file name
./pngout -s0 $f R${f/\.\//}
done
Processar apenas um arquivo de cada vez, leva muito tempo. Depois de executar este aplicativo, vejo que a CPU é de apenas 10%. Então eu descobri que eu posso dividir esses arquivos em 4 lotes, colocar cada lote em um diretório e disparar 4, a partir de quatro janelas de terminal, quatro processos, então eu tenho quatro instâncias do meu script, ao mesmo tempo, processando essas imagens e trabalho leva 1/4 do tempo.
O segundo problema é que perdi tempo dividindo as imagens e os lotes e copiando o script para quatro diretórios, abrindo 4 janelas de terminal, bla bla ...
Como fazer isso com um script, sem ter que dividir nada?
Quero dizer duas coisas: primeiro, como faço de um script bash, disparar um processo para o segundo plano? (basta adicionar & ao final?) Segundo: como eu paro de enviar tarefas para o segundo plano depois de enviar as quarta tarefas e coloco o script para esperar até que as tarefas terminem? Quero dizer, apenas enviando uma nova tarefa para o segundo plano quando uma tarefa termina, mantendo sempre 4 tarefas em paralelo? se eu não fizer isso, o loop disparará zilhões de tarefas para o segundo plano e a CPU ficará obstruída.