/dir
ディレクトリ内のすべての画像の画像サイズを最適化するための次のコードがあります。
find /dir/ -iregex ".*\.\(jpg\|jpeg\)" -exec jpegoptim --strip-all {} \;
このコードを実行すると、サーバーのCPUが大量に消費されます。だから気になります。各項目間に遅延を追加できますかexec
?たとえば、exec
CPUがあまりにも忙しくないように、各画像の各呼び出し間で100ミリ秒の遅延が必要です。
どんな提案がありますか?私のサーバーでCentos 8を実行しています。
答え1
-exec
more を使用してさらにコマンドを追加することもできます。
find /dir/ -iregex ".*\.\(jpg\|jpeg\)" -exec jpegoptim --strip-all {} \; -exec sleep 0.1 \;
しかし、一般的に完全な機能が欲しいだけでなく、いいね他のプロセスでは、niceを使用することは非常に簡単です。
nice find /dir/ -iregex ".*\.\(jpg\|jpeg\)" -exec jpegoptim --strip-all {} \;
答え2
これがnice
同じコマンドが生成される理由です。ionice
nice
プロセスCPUの優先順位を下げるために使用できます。ionice
プロセスIOの優先順位を下げるために使用できます。
この組み合わせにより、プロセスは利用可能なプロセッサとIOパワーのごく一部しか使用できません。この例では、プロセスIOを「ベストエフォート」カテゴリの最下位にプッシュします。
ionice -c2 -n7 find...
IOサブシステムがアイドル状態の場合にのみプロセスを実行するように-c2
変更してください。-c3
この例では、プロセッサクォータを低い優先順位に減らします。
nice -n12 find...
できるだけ低い優先順位-n12
に変更してください。-n19
最大の効果を得るには、以下を組み合わせます。
ionice -c2 -n7 nice -n12 find...
答え3
シェルループを使用し、オプション-exec
で見つかった各イメージファイルに対してfind
forループを実行し、jpegoptim
遅延を追加できます。
find /dir/ -iregex ".*\.\(jpg\|jpeg\)" -exec sh -c '
for file; do jpegoptim --strip-all "$file"; sleep 0.1; done' -- {} +
答え4
を使用すると、-exec cmd ... {} ';'
ファイルごとに1つのインスタンスを実行します。各呼び出しは複数のファイルを処理できるため、次のように変更できます。cmd
jpegoptim
-exec cmd ... {} +
LC_ALL=C nice find . '(' -name '*.[jJ][pP][gG]' -o -name '*.[jJ][pP][eE][gG]' ')' \
-type f -exec jpegoptim --strip-all {} +
(ここのコマンドはfind
標準構文に変換され、一致するように改善されました。みんなまたはで.jpg
終わるファイル名は.jpeg
大文字と小文字を区別せず、通常のファイルに制限されます。
nice
実行中のジョブとは異なるジョブの優先順位を指定するようにスケジューラーに指示しますfind
。プロセッサに十分な空き時間がある場合でも、実行、ロード、初期化などのユーティリティに少しのCPU時間が必要であることを考慮して、これらのタスクをランダムに配置するよりもはるかに効率的です。jpegoptim
sleep
sleep