2012-03-28 15 views
0

vergleichen Wie kann ich den CPU-Auslastung Wert mit Shell-Skript comapre, erhalte ich einen Fehler wie [: =: unärer Operator an der Linie erwartet if [ $message -ne "" ]CPUUsage Wert unter Verwendung von Shell-Skript

#!/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

die Ausgabe von 'top' Parsing ist kaum der richtige Ansatz. Versuchen Sie 'man uptime' oder lesen Sie direkt von'/proc', wenn Ihre Architektur das hat. – tripleee

+0

Ich stimme @tripleee zu. Hier ist eine bessere Methode, um die CPU-Auslastung zu erhalten: 'bc <<<" scale = 3; $ (ps ax -o pcpu = | sortieren -n | xargs printf '+% s' | schneiden -c 2- | bc)/$ (grep -c^processor/proc/cpuinfo) "' (setzt bash und ein Linux '/ proc /' voraus). Dies ergibt einen Durchschnitt über alle Kerne, so dass eine 50% ige Nutzung eines Kerns auf einem Doppelkernsystem "25.000" zurückgeben würde. Der Teil "CPU-Auslastung" sollte ziemlich portabel sein, nur die "Wie viele Kerne?" Teil ist nicht. – Sorpigal

+0

Eine nette Sache bei diesem Ansatz ist, dass Sie 'scale = 3;' fallen lassen und sicher sein können, dass Sie jetzt eine Nicht-Gleitkommazahl zurückbekommen, die Sie direkt mit '-gt' verwenden können. – Sorpigal

Antwort

0

> ein Umleitungsoperator ist. Sie wollen -gt

if [ $cpu_usage -gt $expected_cpuusage ] 

Dies erfordert, dass cpu_usage wie eine ganze Zahl aussehen $ und wird fehlschlagen und einen Fehler erzeugen, wenn es nicht der Fall ist. (. Dh wenn es andere Zeichen als 0-9 enthält -gt nicht vergleichen Gleitkommazahlen, so Strings, die enthalten wird nicht funktionieren ‚‘). Für Fließkommavergleichen Verwendung ausdr:

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

Es Es gibt einfachere Möglichkeiten, diesen Vergleich mithilfe von Bash-Buildern wie [[] durchzuführen, aber diese Konstrukte begrenzen die Portabilität des Skripts. Der andere Fehler, den Sie sehen, tritt auf, wenn Sie eine leere Zeichenfolge verwenden. Versuchen Sie Anführungszeichen:

if [ "$message" -ne "" ] 

aber es ist viel klarer zu verwenden:

if [ -n "$message" ] 
+0

immer noch der gleiche Fehler, ich habe meine Frage auch für die If-Bedingung geändert – Rajeev

+0

nach dem Ändern ich auch diesen ganzzahligen Ausdruck erwartet – Rajeev

+0

Das grundlegende Problem ist immer noch das Fehlen von Anführungszeichen, wie in l0b0 Antwort erklärt. – tripleee

2

Use more quotes:

if [ "$message" -ne "" ] 

sonst leere Strings werden den Ausdruck vermasseln.

Noch besser:

if [ -n "$message" ] 
Verwandte Themen