Ich habe diesen Code, um die Bildgröße aller meiner Bilder im /dir
Verzeichnis 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 exec
jedes 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 -exec
s 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 nice
und ionice
erstellt.
nice
kann verwendet werden, um die CPU-Priorität des Prozesses zu reduzierenionice
kann 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 -c2
es, -c3
um 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 -n12
zu -n19
für die niedrigstmögliche Priorität.
Kombinieren Sie sie für maximale Wirkung:
ionice -c2 -n7 nice -n12 find...
Antwort3
-exec
Sie können eine Shell-Schleife mit der Option verwenden, die für jede gefundene Bilddatei find
eine 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 cmd
für jede Datei eine Instanz von aus. jpegoptim
kann 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 find
Befehl, der in die Standard-Syntax konvertiert und verbessert wurde, so dass er aufalleDateinamen, die auf .jpg
oder enden .jpeg
, berücksichtigen nicht die Groß-/Kleinschreibung und sind auf normale Dateien beschränkt).
nice
weist den Scheduler an, anderen Tasks Vorrang vor den laufenden find
oder zu jpegoptim
geben. Das ist viel effizienter, als diese Tasks sleep
willkü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
).