`-exec` で検索するが遅延あり

`-exec` で検索するが遅延あり

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

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

このコードを実行すると、サーバーの CPU が大量に消費されます。そこで疑問に思うのは、各 の間に遅延を追加することは可能かどうかということですexec。たとえば、各イメージが呼び出されるたびに 100 ミリ秒の遅延が必要ですexec。こうすると、CPU があまり忙しくなりません。

何かお勧めはありますか? 私のサーバーは Centos 8 を実行しています。

答え1

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

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 つ実行します。 は1 回の呼び出しで複数のファイルを処理できるため、 を に変更すると CPU の負荷を大幅に軽減できます。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大文字と小文字を区別せず、通常のファイルに制限されます)。

nicefind実行中のタスクまたはのタスクよりも他のタスクを優先するようにスケジューラに指示しますjpegoptim。プロセッサに十分な余裕がある場合でも、これらのタスクを任意に配置するよりもはるかに効率的ですsleep(ユーティリティの実行、ロード、初期化などに CPU 時間がかかることも考慮してくださいsleep)。

関連情報