/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 ... {} ';'
运行一个 实例。每次调用可以处理多个文件,因此您可以将其更改为: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
程序需要一些 CPU 时间),它也比任意放置这些任务要高效得多。