2015-08-31 38 views
10

在bash腳本中,我需要等到CPU使用率低於閾值。Bash:等到CPU使用率低於閾值

換句話說,我需要一個命令wait_until_cpu_low我會使用這樣的:

# Trigger some background CPU-heavy command 
wait_until_cpu_low 40 
# Some other commands executed when CPU usage is below 40% 

我怎麼能這樣做呢?

編輯:

  • 目標OS是:紅帽企業Linux服務器版本6.5
  • 我考慮CPU的平均利用率(所有內核)
+0

有很多帖子可以幫助獲取當前的CPU使用率。我的做法是在一定的時間間隔之後繼續檢查使用情況,如果使用量不低於閾值,則繼續檢查並且一旦低於閾值,則繼續執行其餘代碼。我不是一個bash編碼器。請讓我意識到,如果我錯過了重要的事情? https://unix.stackexchange.com/questions/152988/how-to-get-cpu-usage-for-every-core-with-a-bash-script-using-standard-nix-tools –

+2

你可以縮小這個範圍向特定的環境提問(例如,Linux或Solaris),這將驅動特定的工具使用。沒有標準的POSIX方法來獲得CPU利用率。此外,你應該澄清你的意思是由於CPU:因爲現代CPU有多個內核,你認爲這些每個CPU?你想要平均的核心?你想要所有CPU的內核平均嗎? – bishop

+0

@bishop謝謝你的澄清。看我的編輯。 – fiddler

回答

3
wait_for_cpu_usage() 
{ 
    current=$(mpstat 1 1 | awk '$12 ~ /[0-9.]+/ { print int(100 - $12 + 0.5) }') 
    while [[ "$current" -ge "$1" ]]; do 
     current=$(mpstat 1 1 | awk '$12 ~ /[0-9.]+/ { print int(100 - $12 + 0.5) }') 
     sleep 1 
    done 
} 

注意它需要安裝sysstat軟件包。

+2

'current'只評估一次,對嗎?不應該在循環內重新計算嗎? – fiddler

+0

其實,電流不是隻評估一次,問題是我忘記了更新當前狀態,所以你是對的 –

+0

'第4行:[[:6.67:語法錯誤:無效算術運算符(錯誤標記爲「.67」) ' – fiddler

3

您可以使用的功能基於top實用程序。但請注意,這樣做並不是非常可靠,因爲CPU利用率可能會隨時迅速改變。這意味着僅僅因爲檢查成功了,不能保證只要下面的代碼運行,CPU利用率就會保持在低水平。你被警告了。

功能:

function wait_for_cpu_usage { 
    threshold=$1 
    while true ; do 
     # Get the current CPU usage 
     usage=$(top -n1 | awk 'NR==3{print $2}' | tr ',' '.') 

     # Compared the current usage against the threshold 
     result=$(bc -l <<< "$usage <= $threshold") 
     [ $result == "1" ] && break 

     # Feel free to sleep less than a second. (with GNU sleep) 
     sleep 1 
    done 
    return 0 
} 

# Example call 
wait_for_cpu_usage 25 

請注意,我使用bc -l以來最高打印CPU利用率爲浮點值的比較。

+0

我得到一個錯誤。'top -n1 | awk'NR == 3 {print $ 2}''''6.2% – fiddler

+0

您使用的是哪個版本的top和awk? – hek2mgl

+0

top:3.2.8,awk:3.1.7 – fiddler

3

效率更高的版本每次只調用mpstatawk一次,並保持它們都運行,直到完成;無需明確sleep並重新啓動每秒鐘兩個過程(其中,嵌入式平臺,可以加起來衡量開銷):

wait_until_cpu_low() { 
    awk -v target="$1" ' 
    $13 ~ /^[0-9.]+$/ { 
     current = 100 - $13 
     if(current <= target) { exit(0); } 
    }' < <(mpstat 1) 
} 

我使用$13這裏,因爲那是idle %是我的版本的mpstat的;如果你的不同,可以適當地替換

這有額外的好處,正確做浮點數學,而不是需要四捨五入到殼本地數學的整數。