2012-03-28 131 views
0

比較cpuusage值我如何使用shell腳本comapre CPU使用率值,我得到一個錯誤的[:=:預計在該行if [ $message -ne "" ]使用shell腳本

#!/bin/sh 

    expected_cpuusage="95" 
    cpu_usage=`top -n 1 -b|grep Cpu|awk '{print $2}'|cut -d"%" -f1""` 
    message="" 
    if [ $cpu_usage -gt $expected_cpuusage ] ##{x%?} 
    then 
     echo "CPU usage exceeded"; 
     if [ $message -ne "" ] 
     then 
     message="$message\n\nCPU usage exceeded configured usage limit \nCurrent CPU usage is $cpu_usage\nConfigured CPU usage is $expected_cpuusage"; 
     else 
     message="CPU usage exceeded configured usage limit \nCurrent CPU usage is $cpu_usage\nConfigured CPU usage is $expected_cpuusage"; 
     fi ; 
    fi 
+0

解析top'的'輸出很難說是正確的做法。如果你的架構有這個,可以嘗試'man uptime'或直接從'/ proc'中讀取。 – tripleee 2012-03-28 15:03:48

+0

我同意@tripleee。這裏有一個更好的方法來獲得CPU利用率:'bc <<<「scale = 3; $(ps ax -o pcpu = | sort -n | xargs printf'+%s'| cut -c 2- | bc)/ $ (grep -c^processor/proc/cpuinfo)「'(假設bash和Linux'/ proc /')。這給所有內核提供了平均值,因此雙核系統上一個內核的50%利用率將返回「25.000」。 「CPU利用率」部分應該相當便攜,只是「多少核心?」部分不是。 – Sorpigal 2012-03-28 15:24:02

+0

這種方法的一個好處是你可以放下'scale = 3;'並且確保你現在得到一個非浮點數,你可以直接使用'-gt'。 – Sorpigal 2012-03-28 15:31:38

回答

0

>元運算符是一個重定向操作符。你想-gt

if [ $cpu_usage -gt $expected_cpuusage ] 

這需要$ cpu_usage看起來像一個整數,將失敗,如果它不產生錯誤。 (即,如果它包含超過0-9其他字符-gt不比較浮點值,所以字符串包含行不通「」)。對於浮點比較,使用EXPR:

if expr $cpu_usage \> $expected_cpuusage > /dev/null; then 

有是使用bash buildins進行這種比較的較爲方便的方法[[,但這些構造限制了腳本的可移植性。 當您使用空字符串時,您會看到另一個錯誤。請嘗試使用引號:

if [ "$message" -ne "" ] 

,但它是更清楚使用方法:

if [ -n "$message" ] 
+0

仍然是一樣的錯誤,我也改變了我的問題,如果條件 – Rajeev 2012-03-28 14:45:11

+0

改變它之後我也得到這個整數表達式預計 – Rajeev 2012-03-28 14:47:19

+0

基本問題仍然缺乏引號,正如l0b0的答案中所解釋的。 – tripleee 2012-03-28 15:01:04

2

Use more quotes

if [ "$message" -ne "" ] 

否則空字符串會搞亂表達。

更妙的是:

if [ -n "$message" ]