"-exec"を使用して検索しますが、遅延が発生しました

"-exec"を使用して検索しますが、遅延が発生しました

/dirディレクトリ内のすべての画像の画像サイズを最適化するための次のコードがあります。

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

このコードを実行すると、サーバーのCPUが大量に消費されます。だから気になります。各項目間に遅延を追加できますかexec?たとえば、execCPUがあまりにも忙しくないように、各画像の各呼び出し間で100ミリ秒の遅延が必要です。

どんな提案がありますか?私のサーバーでCentos 8を実行しています。

答え1

-execmore を使用してさらにコマンドを追加することもできます。

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で見つかった各イメージファイルに対してfindforループを実行し、jpegoptim遅延を追加できます。

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

答え4

を使用すると、-exec cmd ... {} ';'ファイルごとに1つのインスタンスを実行します。各呼び出しは複数のファイルを処理できるため、次のように変更できます。cmdjpegoptim-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時間が必要であることを考慮して、これらのタスクをランダムに配置するよりもはるかに効率的です。jpegoptimsleepsleep

関連情報