/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 時間),它也比任意放置這些任務要高效得多。