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

相關內容