load des Servers überwachen

S

SHP

Grünschnabel
Hallo zusammen,

ich möchte die Load meines Serves überwachen und dachte da an folgende Zeile, um zunächst einmal den Wert zu bekommen:
Code:
top -b -n1 | grep 'load' | awk '{print $12}'

Scheinbar kann ich "awk" jedoch in der Kombination nicht ausführen.
Wie sähe das korrekt aus?

Ziel ist es später diese Zeile in der "crontab" einzutragen und bei übertreten eines festgelegten Schwellwerts eine Mail auszulösen.
Ist das so möglich, wie ich mir das vorstelle?
 
hö ... jetzt bin ich grad irritiert worden...

Das scheint so doch zu funktionieren. Da muss sich ein Sonderzeichen eingeschlichen haben.

Wer möchte darf mir aber gerne ne bessere Lösung vorschlagen oder mit dem nächsten Schritt helfen.
Bin leider alles andere als ein Guru auf dem Gebiet.

Ansonsten, entschuldige ich mich für die doofe Frage!
 
den grep brauchst du nicht, das kann der awk selber:
Code:
top -b -n 1 | awk '/load/ {print $12}'
 
Hallo,

das ist durchaus so möglich.

Es spricht auch nichts dagegen das Rad neu zu erfinden :D, aber grade im Berreich Systemmonitoring gibts für so gut wie alles schon fertige Skripte / Programme.
Bei den Nagios-Plugins ist z. B. ein Skript "check_load" vorhanden, welches auch ohne Nagios verwendet werden kann.
Wenn du nur einen einzelnen Host zu überwachen hast, ist eventuell auch Munin für dich interessant. Das Überwacht von Hause aus alles mögliche an Parametern und zeichnet auch gleich nette Kurven.

mfg
HeadCrash
 
Danke für eure Tipps.

Habe mittlerweile noch etwas weiter gelesen und die Meinung gesehen, das man sich den Wert besser so holt, da diese Variante performanter sei:
Code:
cat /proc/loadavg | cut -d" " -f2

Derzeit hänge ich mich am simplen "if" auf ... was daran ist nicht korrekt?
Code:
if [3 -gt 2] then echo "ist groesser" fi

Mit dem "If" möchte ich später entscheiden, ob der Wert oben größer ist als ein festgelegter Schwellwert und dann wie folgt eine Mail versenden:
Code:
echo "Inhalt" | mail -s "Betreff" meine@mailadresse.de
Das mit der Mail klappt einzeln schon mal.
 
Tach.
2 Ansätze finde ich gut:
- programmieren (bzw. skripten) lernen zu wollen
- mal Dinge selber auszuprobieren ohne auf von anderen verfasste Skripte zurückzugreifen
Falls es sich aber um das superkritische System handelt, ohne das die Firma sofort baden geht, stimme ich HeadCrash natürlich zu. Und man kann ja von vorhandenen Skripten (z.B. check_load) auch lernen und mal nachsehen, wie die das so machen. Nagios Skripte sind ja auch nicht immer das Gelbe vom Ei :-)
bye,
yai
 
hm... die Semikolons. Dachte das gestern auch schon mal versucht zu haben. Vermutlich hab ich das zweite vergessen.
Danke jedenfalls, so klappt das if natürlich.

Im Grunde will ich in dem Bereich gerne was dazulernen und mein Problem bei fertigen Scripts ist dann, das ich es mir nicht so leicht merken kann, als hätte ich es selbst mal geschrieben.
Zudem, dachte ich mir, ist das ja was kleines und ich muss nicht irgend ein größeres Performance-Mess-Gedöns-Tool auf dem Server zum laufen bringen. Soll ja klein und schlank sein. Zudem ist es, dank meiner umfangreichen Kenntnisse, ein Managed Server. ;) Da darf/kann ich das dann ggf. gar nicht installieren ...

Genug bla bla... ich danke allen nochmals für die Hilfestellungen bisher. Nun werde ich mich mal dran machen meine drei Brocken zu einem zusammenzuführen.
 
Das Zusammensetzen scheint mir doch noch gewisse Schwierigkeiten zu bereiten.

Erster Schritt wäre mal den Load-Wert aus der Datei mit einem von mir definierten Wert zu vergleichen um dann eine Ausgabe zu machen.
Also diese beiden Punkt zu verbinden:
Code:
cat /proc/loadavg | cut -d" " -f2
Code:
if [ 3 -gt 2 ]; then echo "ist groesser"; fi

Habe nun diverses ausprobiert und natürlich nachgelesen, aber so richtig scheint das alles nicht gewesen zu sein.
Ist denn schon mal korrekt, das ich Teil 1 so schreiben muss, damit ich den Wert des Befehls nutze?
Code:
echo $(cat /proc/loadavg | cut -d" " -f2)

Dann dachte ich, müsste das "if" so aussehen:
Code:
if [ $(cat /proc/loadavg | cut -d" " -f2) -gt 1 ]; then echo "GRO"; fi
-bash: [: 1.86: integer expression expected
oder
Code:
if [$(cat /proc/loadavg | cut -d" " -f2) -gt 1]; then echo "GRO"; fi
-bash: [1.76: command not found
Hatte noch andere Ansätze mit gefühlten 5000 Klammern diverser Art, aber das führt ja zu nix...
Also muss ich doch noch mal um Hilfe bitten.
 
Hi,

Der vorletzte Ansatz sieht eigentlich richtig aus, dein Problem ist, dass die Bash nur Integer/Ganzzahlen verarbeiten kann

Entweder du wirst die Kommastelle los, z.B. so
Code:
echo $LOAD * 100 | bc

oder du verwendest eine andere Skriptsprache.

mfg
HeadCrash
 
ok, das kann ich nachvollziehen.

So bekomme ich nun einen Wertt "xyz.00" - also vermutlich noch nicht ganz ein "int":
Code:
echo "$(cat /proc/loadavg | cut -d" " -f2) * 100" | bc
Daher dann vielleicht so:
Code:
echo "$(cat /proc/loadavg | cut -d" " -f2) * 100" | bc | cut -d"." -f1

Aber wie muss das nun im "if" aussehen? Das konnte ich bisher nicht ausführen.
 
Code:
load=`echo "$(cat /proc/loadavg | cut -d" " -f2) * 100" | bc | cut -d"." -f1`
if [ $loat -gt $load_warn ]; then

würde ich so machen einfach damit ein bisschen Übersichtlichkeit erhalten bleibt.

mfg
HeadCrash

PS: Es gibt irgendeinen Unterschied zwischen der Programausführung mit Backticks "`" und der Variante mit Klammern, aber welchen genau kann ich dir auch nicht verraten.
 
Zuletzt bearbeitet:
Ich bin nun auf ein sh-Script ausgewichen... glaube ich habs mir damit etwas schwer gemacht, alles in einer Zeile haben zu wollen.
Darauf kam ich ja nur, weil es in nen "crontab" Eintrag aufgenommen werden soll, aber das kann ich über nen Shell Script Aufruf natürlich auch. Bloß ist es da nun viel simpler und übersichtlicher.

Werde es nach Abschluss dann mal posten.
 
Code:
#!/bin/sh

loadAvgAll=$(cat /proc/loadavg)
echo $loadAvgAll

loadAvg5min=$(echo $loadAvgAll | cut -d" " -f2)
echo $loadAvg5min

loadAvg5min100=$(echo "$loadAvg5min * 100" | bc | cut -d"." -f1)			# avoid float; make it int
#echo $loadAvg5min100

loadThresholdValue100=$(echo "1.15 * 4 * 100" | bc | cut -d"." -f1)			# 1.15 == constant / 2 == amount of CPU cores / 100 == avoid float
#echo $loadThresholdValue100

# if load higher then threshold value
if 
	[ $loadAvg5min100 -gt $loadThresholdValue100 ]
then 
	echo "High load"
	echo "Load: $loadAvgAll" | mailx -a From:mail@address.com -s "HIGH LOAD ON SERVER" mail@address.com
fi

Hatte schon fast vergessen den Code zu posten. Also so sieht er nun aus.
Eine Frage und eine Bitte hab ich noch:
1.
Ich hab mal gelesen, das man den Grenzwert (Load), an dem der Server es nicht mehr schafft alle Anfragen sofort zu verarbeiten ungefähr so ermittelt werden kann: Konstante 1.15 * Anzahl CPU Kerne. Ist das eurer Meinung nach auch ok so? Oder kennt ihr eine bessere Formel, um das annähernd zu ermitteln? Kann mir nicht vorstellen, das das ausreichend ist, denn da spielen ja noch ein paar andere Faktoren eine Rolle neben der CPU.

2.
Es wäre nett, wenn ihr das Script mal auf mögliche Probleme und Performance durchschaut und mir mitteilen würdet, was hier zu optimieren wäre.

So das sollte es dann sein. Ein frohes Neues noch an alle!
 

Ähnliche Themen

Server-Monitoring mit RRDTool

Zurück
Oben