2012-03-28 134 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" ]