Suchen mit `-exec`, aber mit Verzögerung

Suchen mit `-exec`, aber mit Verzögerung

Ich habe diesen Code, um die Bildgröße aller meiner Bilder im /dirVerzeichnis zu optimieren:

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

Wenn ich diesen Code ausführe, verbraucht er einen großen Teil der CPU meines Servers. Daher frage ich mich: Ist es möglich, zwischen jedem eine Verzögerung einzufügen exec? Ich möchte beispielsweise eine Verzögerung von 100 Millisekunden zwischen jedem Aufruf execjedes Bilds, damit die CPU nicht zu sehr ausgelastet wird.

Was würden Sie vorschlagen? Auf meinem Server läuft Centos 8.

Antwort1

Sie können auch weitere Befehle hinzufügen, indem Sie weitere -execs verwenden

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

Aber als allgemeine Regel gilt: Wenn Sie möchten, dass es voll funktioniert, aberHübschFür andere Prozesse ist es ganz einfach, nice zu verwenden:

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

Antwort2

Aus diesem Grund wurden Befehle wie niceund ioniceerstellt.

  • nicekann verwendet werden, um die CPU-Priorität des Prozesses zu reduzieren
  • ionicekann verwendet werden, um die Prozess-IO-Priorität zu reduzieren

Eine Kombination dieser Methoden kann sicherstellen, dass Ihr Prozess nur einen kleinen Teil der verfügbaren Prozessor- und IO-Kapazität beansprucht. Dieses Beispiel verschiebt die Prozess-IO an das unterste Ende der „Best Effort“-Klasse:

ionice -c2 -n7 find...

Ändern Sie -c2es, -c3um sicherzustellen, dass Ihr Prozess nur ausgeführt wird, wenn das IO-Subsystem ansonsten im Leerlauf ist.

In diesem Beispiel wird die Prozessorzuteilung auf eine niedrige Priorität herabgesetzt:

nice -n12 find...

Wechseln Sie -n12zu -n19für die niedrigstmögliche Priorität.

Kombinieren Sie sie für maximale Wirkung:

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

Antwort3

-execSie können eine Shell-Schleife mit der Option verwenden, die für jede gefundene Bilddatei findeine for-Schleife mit einer zusätzlichen Verzögerung ausführt .jpegoptim

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

Antwort4

Wenn Sie verwenden -exec cmd ... {} ';', führen Sie cmdfür jede Datei eine Instanz von aus. jpegoptimkann pro Aufruf mehr als eine Datei verarbeiten, Sie können Ihren CPUs also eine Menge Arbeit ersparen, wenn Sie es in ändern -exec cmd ... {} +:

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

(hier mit dem findBefehl, der in die Standard-Syntax konvertiert und verbessert wurde, so dass er aufalleDateinamen, die auf .jpgoder enden .jpeg, berücksichtigen nicht die Groß-/Kleinschreibung und sind auf normale Dateien beschränkt).

niceweist den Scheduler an, anderen Tasks Vorrang vor den laufenden findoder zu jpegoptimgeben. Das ist viel effizienter, als diese Tasks sleepwillkürlich zuzuweisen, selbst wenn Ihre Prozessoren viel Zeit übrig haben (denken Sie auch daran, dass das Ausführen, Laden, Initialisieren usw. eines Dienstprogramms einige CPU-Zeit in Anspruch nimmt sleep).

verwandte Informationen