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, así 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í tiempo dividiendo las imágenes y lotes y copiando el script a cuatro directorios, abrí 4 ventanas de terminal, bla bla…
¿Cómo hacer eso con un guión, sin tener que dividir nada?
Me refiero a dos cosas:primero, ¿cómo puedo desde un script bash, disparar un proceso al fondo? (¿simplemente agregue &al final?) Segundo:¿cómo dejo de enviar tareas al fondo después de enviar las cuartas tareas y pongo el script en espera hasta que finalicen las tareas? Quiero decir, ¿solo enviar una nueva tarea al fondo cuando finaliza una tarea, manteniendo siempre 4 tareas en paralelo? si no lo hago, el bucle disparará millones de tareas al fondo y la CPU se obstruirá.
Respuesta aceptada:
Si tiene una copia de xargs
que admite la ejecución en paralelo con -P
, simplemente puedes hacer
printf '%s