Ho un sacco di immagini PNG su una directory. Ho un'applicazione chiamata pngout che eseguo per comprimere queste immagini. Questa applicazione è chiamata da uno script che ho fatto. Il problema è che questo script fa uno alla volta, qualcosa del genere:
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
L'elaborazione di un solo file alla volta richiede molto tempo. Dopo aver eseguito questa app, vedo che la CPU è solo del 10%. Così ho scoperto che posso dividere questi file in 4 batch, mettere ogni batch in una directory e sparare 4, da quattro finestre terminali, quattro processi, quindi ho quattro istanze del mio script, allo stesso tempo, elaborando quelle immagini e il il lavoro richiede 1/4 del tempo.
Il secondo problema è che ho perso tempo dividendo le immagini e i batch e copiando lo script in quattro directory, aprendo 4 finestre terminali, bla bla ...
Come si fa con uno script, senza dover dividere nulla?
Intendo due cose: prima come faccio da uno script bash, eseguo un processo in background? (basta aggiungere & fino alla fine?) Secondo: come posso interrompere l'invio di attività in background dopo aver inviato le quarte attività e mettere lo script in attesa fino alla fine delle attività? Voglio dire, basta inviare una nuova attività in background al termine di una attività, mantenendo sempre 4 attività in parallelo? se non lo faccio, il loop genererà miliardi di attività in background e la CPU si ostruirà.