使用“-exec”查找但有延迟

使用“-exec”查找但有延迟

/dir我有这段代码来优化目录中所有图像的图像大小:

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

当我运行此代码时,它会消耗大量服务器 CPU。所以我想知道:我是否可以在每个之间添加延迟exec?例如,我希望每次exec调用每个图像之间有 100 毫秒的延迟,这样 CPU 就不会变得非常繁忙。

你有什么建议?我的服务器运行的是 Centos 8。

答案1

-exec您还可以使用 more s添加更多命令

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...

更改-c2-c3以确保您的进程仅在 IO 子系统空闲时运行。

此示例将处理器配额降低到低优先级:

nice -n12 find...

更改-n12-n19尽可能最低的优先级。

将它们组合起来以获得最大效果:

ionice -c2 -n7 nice -n12 find...

答案3

您可以使用 shell 循环,并-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 ... {} ';'运行一个 实例。每次调用可以处理多个文件,因此您可以将其更改为: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告诉调度程序将其他任务优先于正在运行的任务findjpegoptimsleep即使您的处理器有足够的空闲时间(还要考虑到执行、加载、初始化等实用sleep程序需要一些 CPU 时间),它也比任意放置这些任务要高效得多。

相关内容