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 eu fiz. O problema é que esse script executa um de cada vez, algo como isto:
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 por vez, leva muito tempo. Depois de executar este aplicativo, vejo que a CPU é de apenas 10%. Então, descobri que posso dividir esses arquivos em 4 lotes, colocar cada lote em um diretório e disparar 4, de quatro janelas de terminal, quatro processos, para que eu tenha quatro instâncias do meu script, ao mesmo tempo, processando essas imagens e as o trabalho leva 1/4 do tempo.
O segundo problema é que perdi tempo dividindo as imagens e 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 a partir de um script bash, aciono um processo em segundo plano? (basta adicionar & ao final?) Segundo: como eu paro de enviar tarefas para segundo plano depois de enviar a quarta tarefa e coloco o script em espera até que as tarefas terminem? Quero dizer, apenas enviando uma nova tarefa para o plano de fundo quando uma tarefa termina, mantendo sempre quatro tarefas em paralelo? se eu não fizer isso, o loop disparará zilhões de tarefas em segundo plano e a CPU ficará obstruída.