Tengo un montón de imágenes PNG en un directorio. Tengo una aplicación llamada pngout que ejecuto para comprimir estas imágenes. Esta aplicación es llamada por un script que hice. El problema es que este script hace uno a la vez, algo como esto:
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
Procesar solo un archivo a la vez, lleva mucho tiempo. Después de ejecutar esta aplicación, veo que la CPU es solo del 10%. Entonces descubrí que puedo dividir estos archivos en 4 lotes, poner cada lote en un directorio y disparar 4, desde cuatro ventanas de terminal, cuatro procesos, por lo que tengo cuatro instancias de mi script, al mismo tiempo, procesando esas imágenes y el El trabajo toma 1/4 del tiempo.
El segundo problema es que perdí el tiempo dividiendo las imágenes y lotes y copiando el script en cuatro directorios, abriendo 4 ventanas de terminal, bla bla ...
¿Cómo hacer eso con un script, sin tener que dividir nada?
Me refiero a dos cosas: primero, ¿cómo hago desde un script bash, disparo un proceso a un segundo plano? (¿solo agregar & al final?) Segundo: ¿cómo dejo de enviar tareas a un segundo plano después de enviar las cuartas tareas y pongo el script en espera hasta que finalicen las tareas? Quiero decir, ¿simplemente enviar una nueva tarea a un segundo plano cuando finaliza una tarea, manteniendo siempre 4 tareas en paralelo? si no lo hago, el bucle disparará millones de tareas a un segundo plano y la CPU se obstruirá.