Buscar con `-exec` pero con un retraso

Buscar con `-exec` pero con un retraso

Tengo este código para optimizar el tamaño de la imagen de todas mis imágenes dentro /dirdel directorio:

find /dir/ -iregex ".*\.\(jpg\|jpeg\)" -exec jpegoptim --strip-all {} \;

Cuando ejecuto este código, consume gran parte de la CPU de mi servidor. Entonces me pregunto: ¿es posible agregar un retraso entre cada uno exec? Por ejemplo, quiero 100 milisegundos de retraso entre cada vez que execse llama a cada imagen, de esta manera la CPU no se ocupa mucho.

¿Qué sugieres? Mi servidor ejecuta Centos 8.

Respuesta1

También puedes agregar más comandos usando más -execs.

find /dir/ -iregex ".*\.\(jpg\|jpeg\)" -exec jpegoptim --strip-all {} \; -exec sleep 0.1 \;

Pero por norma general si quieres tenerlo funcionando a tope pero estandolindoPara otros procesos, es muy sencillo utilizar nice:

nice find /dir/ -iregex ".*\.\(jpg\|jpeg\)" -exec jpegoptim --strip-all {} \;

Respuesta2

Esta es la razón por la que se crearon comandos como nicey .ionice

  • niceSe puede utilizar para reducir la prioridad de la CPU del proceso.
  • ioniceSe puede utilizar para reducir la prioridad de E/S del proceso.

Una combinación de estos puede garantizar que su proceso requiera solo una pequeña porción del procesador disponible y de la capacidad de E/S. Este ejemplo lleva el proceso IO al extremo más bajo de la clase de "mejor esfuerzo":

ionice -c2 -n7 find...

Cambie -c2a -c3para garantizar que su proceso solo se ejecute cuando el subsistema IO esté inactivo.

Este ejemplo reduce la asignación del procesador a una prioridad baja:

nice -n12 find...

Cambie -n12a -n19la menor prioridad posible.

Combínalos para obtener el máximo efecto:

ionice -c2 -n7 nice -n12 find...

Respuesta3

Puede usar un bucle de shell con -execla opción de findque ejecute un bucle for jpegoptimpara cada archivo de imagen encontrado, con un retraso adicional

find /dir/ -iregex ".*\.\(jpg\|jpeg\)" -exec sh -c '
  for file; do jpegoptim --strip-all "$file"; sleep 0.1; done' -- {} +

Respuesta4

Al usar -exec cmd ... {} ';', estás ejecutando una instancia de cmdpara cada archivo. jpegoptimpuede procesar más de un archivo por invocación, por lo que evitaría mucho trabajo a su CPU cambiándolo a -exec cmd ... {} +:

LC_ALL=C nice find . '(' -name '*.[jJ][pP][gG]' -o -name '*.[jJ][pP][eE][gG]' ')' \
  -type f -exec jpegoptim --strip-all {} +

(aquí con el findcomando convertido a sintaxis estándar y mejorado para que coincida contodonombres de archivos que terminan en .jpgo .jpegsin distinguir entre mayúsculas y minúsculas y restringidos a archivos normales).

nicele dice al programador que priorice otras tareas sobre las que se están ejecutando findo jpegoptim. Es mucho más eficiente que realizar esas tareas de sleepforma arbitraria, incluso cuando sus procesadores tienen mucho tiempo de sobra (también considere que se necesita algo de tiempo de CPU para ejecutar, cargar, inicializar, etc., una sleeputilidad).

información relacionada