Найти с `-exec`, но с задержкой

Найти с `-exec`, но с задержкой

У меня есть этот код для оптимизации размера всех моих изображений внутри /dirкаталога:

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

Когда я запускаю этот код, он потребляет много ресурсов процессора моего сервера. Поэтому мне интересно: возможно ли мне добавить задержку между каждым exec? Например, я хочу задержку в 100 миллисекунд между каждым execвызовом каждого изображения, таким образом процессор не будет слишком загружен.

Что бы вы посоветовали? Мой сервер работает на Centos 8.

решение1

Вы также можете добавить больше команд, используя more -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может использоваться для снижения приоритета ЦП процесса
  • ioniceможет использоваться для снижения приоритета ввода-вывода процесса

Сочетание этих факторов может гарантировать, что ваш процесс займет лишь небольшую часть доступного процессора и возможностей ввода-вывода. Этот пример перемещает процесс ввода-вывода в самый нижний предел класса "наилучших усилий":

ionice -c2 -n7 find...

Измените -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 ... {} ';', вы запускаете один экземпляр 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или jpegoptim. Это намного эффективнее, чем sleepпроизвольно задавать эти задачи, даже если у ваших процессоров достаточно свободного времени (также учтите, что для выполнения, загрузки, инициализации и т. д. утилиты требуется некоторое процессорное время sleep).

Связанный контент