Raspberry Pi: Überwachen mit Monitoring
Der Raspberry Pi ist übertaktet und soll im 24/7 Dauerbetrieb laufen. Wie man einen Stabilen Betrieb hinbekommt, haben wir uns schon im Artikel Stabiler 24/7 Dauerbetrieb angesehen. Jedoch ist es nicht verkehrt, Daten über den Raspberry Pi zu sammeln, um diese im Bedarfsfall analysieren zu können. Zum Anderen können solche Daten auch helfen, ein Frühwarnsystem zu bauen, dass z.B. Alarm schlägt, wenn der Raspberry Pi zu heiß wird. Im Folgenden werde ich zwei Monitoring Systeme benennen, zu welchen ich jeweils Installationsanleitungen verlinkt habe, und darauffolgend werden wir ein kleines Script einrichten, dass bei einer außergewöhnlichen Wärmeentwicklung eine E-Mail versendet.
Voraussetzung: Raspbian oder vergleichbare Distribution installiert
Dieses kleine Programm ist ein, extra für den Raspberry Pi geschriebenes, Monitoring Tool. Neben dem Auslesen aktueller Werte des Raspberry Pis, schreibt es auch die CPU-, RAM-, SWAP- und Netzwerk-Auslastung wie auch die Prozessor Temperatur, Uptime und SD-Karten Nutzung mit und bereitet diese Daten in ein paar übersichtlichen Graphen auf. Der Funktionsumfang ist nicht der Größte, aber es erfüllt den Zweck, dass man sich die gesammelten Daten im Nachhinein ansehen kann.
Wie man RPi-Monitor installiert erklärte ich bereits hier im Blog.
Ein meines Wissens nach sehr weit verbreitetes Monitoring Tool ist Munin. Und das keines Wegs zu unrecht, denn dieses Tool hat, insbesondere weil es modular aufgebaut ist und damit einfach erweitert werden kann, einen wirklich großartigen Funktionsumfang. Im Gegensatz zu anderen Monitoring Tools ist die grafische Ausgaben jedoch eher funktional als eine Augenweide.
Wie man einen Munin Server auf dem Raspberry Pi installiert, wurde auf Pingbin (Englisch) erklärt. Die Vorgehensweise, wie man ein Plugin installiert, dass viele Werte aus dem Raspberry Pi ausließt, erklärte Jörg Bösche in seinem Blog.
Nachdem wir nun zwei Lösungen zum Monitoring auf längere Dauer kennen, sollten wir ein Script einrichten, dass im Fall einer Überhitzung des Raspberry Pis direkt eine E-Mail an uns versendet. Natürlich könnte man auch Scripts schreiben, die in anderen Fällen Alarm schlagen, jedoch denke ich, dass die Überhitzung des Raspberry Pis das größte Problem ist, dass auftreten kann. Im Folgenden beziehen wir uns auf die Angabe des Prozessor Temperatur Sensors.
Zunächst legen wir folgendes Script auf dem Raspberry Pi z.B. im Home-Verzeichnis des Benutzers pi ab. Dabei müssen wir die Variablen smtpHost (Adresse des SMTP-Servers), smtpPort (Port des SMTP-Servers), smtpUser (SMTP-Benutzername), smtpPassword (Passwort des SMTP-Benutzers), mailSender (Absender der E-Mail), mailReceiver (Empfänger der E-Mail) und criticalTemperature (CPU Temperatur ab der eine E-Mail versendet werden soll) anpassen. Die E-Mails werden dann über ein SMTP-Account versendet (möglichst das der Absender E-Mail-Adresse), sodass sie möglichst nicht in Spam-Filtern hängen bleiben. In dem Editor nano kann man mittels STRG + X, Y und Enter speichern.
nano monitoring-cpu-temp.py
import os import smtplib import time from email.mime.text import MIMEText ### Settings # SMTP smptHost = "smtp.example.de" smtpPort = 587 smtpUser = "[email protected]" smtpPassword = "thisisapassword" # E-Mail mailSender = "[email protected]" mailReceiver = "[email protected]" # Warning criticalTemperature = 60 # in degree celsius ### date = "%02i.%02i.%04i" % (int(time.localtime()[2]), int(time.localtime()[1]), int(time.localtime()[0])) time = "%02i:%02i:%02i" % (int(time.localtime()[3]), int(time.localtime()[4]), int(time.localtime()[5])) def getCPUtemperature(): res = os.popen('vcgencmd measure_temp').readline() return(res.replace("temp=","").replace("'C\n","")) tempFloat = float(getCPUtemperature()) if (tempFloat > criticalTemperature): server = smtplib.SMTP(smptHost, smtpPort) # server.starttls() # If TLS authentication should be used remove the hash at start of line server.login(smtpUser, smtpPassword) value = "Die aktuelle Temperatur des Raspberry Pi liegt bei " + str(tempFloat) + " Grad Celsius." + "\n" + "Zeit: " + time + " am " + date msg = MIMEText(value) msg['Subject'] = "[Warning] Rasperry Pi Temperatur " + str(tempFloat) + " Grad!" msg['From'] = mailSender msg['To'] = mailReceiver server.sendmail(mailSender, mailReceiver, msg.as_string()) server.quit()
Nun legen wir einen Cronjob an, der alle fünf Minuten das Script ausführt. Dadurch wird alle fünf Minuten die Temperatur des Raspberry Pis überprüft und gegebenenfalls eine Warnung per E-Mail versendet.
crontab -e
*/5 * * * * python monitoring-cpu-temp.py >/dev/null 2>&1
Wir kennen nun zwei Systeme um ein Monitoring des Raspberry Pis über längere Zeit durchzuführen und haben ein Warnungssystem eingerichtet, welches Alarm schlägt sobald sich der Raspberry Pi überhitzt.
41 Kommentare. Hinterlasse eine Antwort
Hallo,
alle 3 Programme/Scripte funktionieren sehr gut bei mir. Allerdings stört es mich etwas, dass in dem monitoring-cpu-temp Script das Passwort im Klartext gespeichert werden muss. Gibt es dafür eine andere Lösung, die mit Hash Werten arbeitet? Oder evt. über die Shadow-Datei o.ä.?
Vielen Dank für die Antwort!
David
Könnte man machen. Die Frage ist nur was es bringt, denn im Endeffekt müsste das Script das Passwort wieder entschlüsseln können um es zum verbinden zu verwenden. Entsprechend wäre das nur Mehraufwand, der nicht wirklich etwas bringt. Tipp: Lege dir für solche Scripts einfach ein eigenes Mail Account an 😉
Ansonsten kannst du es ja etwas schützen mit chmod 660 monitoring-cpu-temp.py
Also irgendwas ist bei mir dabei falsch gelaufen denke ich. Zunächst hat alles funktioniert und hab das image gesichert. Danach habe ich noch andere Sachen getestet was nicht funktioniert hatte. Nachdem ich nun das image mit dem monitoring wieder laden wollte ist der pi nicht hoch gefahren. irgendwas mit keine root rechte glaube ich kam.
Jetzt hab ich das image vor dem monitoring geladen und er läuft wieder.
Werde denke ich das ganze nochmal versuchen und dann schauen ob dann alles geht oder nicht.
ps. das mit dem passwort in klartext finde ich auch nicht so schön. hab mir daher auch gleich ne eigene mailadresse für den pi angelegt.
Andere Möglichkeit wäre das Passwort verschlüsselt mit dem Schlüssel zum entschlüsseln dort reinzuschreiben (was folglich keinen Sicherheitsmehrwert bring), da du ja nicht immer beim versenden der E-Mail das Passwort zum entschlüsseln des Passwortes eingeben möchtest, oder? 😉
Hi Jan,
ich schaue öfter mal hier rein wegen der Artikel über den RasPi. Danke dafür! Die kontinuierliche Überwachung der Temperatur geht aber einfacher. Ein einfaches Bash-Script tut es:
#!/bin/bash
temp=$(cat /sys/class/thermal/thermal_zone0/temp)
tempC=$(echo $temp/1000 | bc -l | sed -e 's*00000000000000000**')
prozesse=$(ps -Aeo "%C %c" | awk '{ if (int($1) > 1) { print $0 } }')
if (test "$temp" -ge 65000) && (test "$temp" != 85000)
then
echo -e "CPU-Temperatur $temp Grad\n%CPU Prozess\n$prozesse" | mail -s "Warnung: RasPi - CPU ist $temp Grad warm!" [email protected]
fi
Alles nach „echo“ ist eine Zeile. Was macht das Script? In der ersten Zeile wird die Temperatur ausgelesen und in der Variable temp festgehalten. Die Temperatur wird in Milligrad ausgelesen, 65 Grad Celsius wären also 65000. In der Variable tempC wird das in Grad Celsius umgerechnet, der Ausdruck nach sed schneidet die überflüssigen Nullen der Rechenoperation ab.
Die nächste Zeile überschlagen wir zunächst. Dann wird mit der Zeile if … der Grenzwert festgelegt – hier 65 Grad. Wenn temp also größer oder gleich (ge steht für greater equal) 65000 ist, wird eine Mail verschickt (then echo …) Der Inhalt der Mail kann angepasst werden. Hier zunächst die Warnmeldung mit der Temperatur (tempC), dann ein Zeilenumbruch (\n) und dann noch eine Auflistung der Prozesse, die mehr als 1 Prozent Prozessorlast verursachen. Diese Prozesse werden mit der dritten Zeile des Scripts ausgelesen (Variable prozesse). So kann man dann den Übeltäter für die Temperatursteigerung finden. Nach -s steht das Subject der Mail, welches natürlich auch angepasst werden muss und natürlich die Mail-Adresse.
Das Testkriterium (Zeile if …) enthält noch „&& (test „$temp“ != 85000)“ – wozu das? Das habe ich nachträglich eingefügt, weil ich von Zeit zu Zeit Meldungen bekommen habe, dass die Temperatur exakt 85 Grad beträgt. Wenn die Temperatur 5 Minuten davor noch normal und fünf Minuten später ebenfalls normal ist, die Temperatur immer exakt 85,000 Grad ist, und keine auffällig hohe Prozessorlast vorhanden ist, muss das ein Fehlalarm sein. Also wird eine Temperatur von exakt 85 Grad keine Mail auslösen.
Statt 40 Zeilen Python-Code sind es einfache 10 Zeilen. Das Ganze wie von Dir beschrieben alle 5 Minuten von Cron aufgerufen. Eine Mailkonfiguration können wir uns sparen, denn ein fertig konfigurierter MTA ist in den meisten Fällen sowieso schon da.
Bzgl. Mail: Wenn dein Mail Client/Server jedoch einen Spam Check auf MX Records hat (z.B. Gmail) ist der von dir verwendete Mailversand von Nachteil, da die Mail mit hoher Wahrscheinlichkeit im Spamfilter hängen bleibt. Ansonsten auch eine gute Lösung – wobei ich nicht glaube, dass es nicht wirklich relevant ist ob es ein paar Zeilen mehr oder weniger sind 😉
Der MTA (meist Postfix, aber auch Sendmail, Elim, ich verwende SSMTP) soll ja nicht selbst die Mail versenden, sondern als „Satellit“ arbeiten. Er verschickt die Mail also an meinen regulären SMTP-Server, z.B. von Googlemail, GMX, etc. Da sollte also kein Problem mit dem MX Record/MX Resource Record/SPF auftreten. Bei mir persönlich gibt es keine Probleme.
Richtig, ob 10 oder 40 Zeilen Code ist nicht tragisch, wobei 10 Zeilen irgendwie übersichtlicher sind. Aber für mich noch wichtiger: Das von Dir gebrachte Script macht eine unverschlüsselte SMTP-Verbindung auf. Hier gehen nicht nur die Nachricht, sondern auch Benutzername und Passwort auch im Klartext über die Leitung. Das muss nicht sein. Wenn ich einen der oben genannten MTAs verwende, kann ich auch TLS-verschlüsselte Verbindungen zum Mailserver aufbauen. Ob die verwendete Python-Bibliothek smtplib das auch kann, weiß ich nicht. Wenn, dann wäre das eine Ergänzung wert.
Und noch eine Ergänzung: Ich habe gerade von meinem Pi aus eine Mail erfolgreich über smtp.googlemail.com verschickt. Kein Problem mit Spam-Verhinderung.
Deine Methode bedarf meines Wissens nach dann aber weiteren Einrichtungen im System und die Anleitung sollte möglichst „easy to use“ sein. Habe deinen Verbesserungsvorschlag mit TLS mal aufgenommen und das Script entsprechend angepasst. Danke!
Es bedarf lediglich eines konfigurierten MTA. Wie ich schon schrieb, wird das oft schon vorhanden sein. Wenn nicht, hast Du natürlich Recht. Andererseits komme ich ohne Munin oder RpiMonitor aus.
Ja aber Postfix können die wenigsten wirklich konfigurieren. Wählt jemand aus Unwissenheit „Internet Site“ kann das jammern schon groß sein.
Grundsätzlich ist es aber wie du sagst eine gute Alternative, da man ja bei „Satellite System“ alle ausgehenden Emails über einen Smarthost verschickt. (GMX, Web oder was auch immer) Bei Smarthost muss man je nach Anbieter noch das eine oder andere beachten.
Völlig richtig, Postfix ist ein Monster. Glücklicherweise gibt es da keine Default-Einstellung, bei der Installation wird man gefragt, welchen Modus man verwenden möchte. Dann sollte man sich schon Gedanken machen und nicht „irgendwas“ anklicken. Wie ich schon schrieb: Ich verwende SSMTP, das ist wirklich einfach einzurichten. Vorteil eines funktionierenden MTA ist, dass ich den für verschiedene Zwecke verwenden kann, z.B. auch für die Mails von cron. Nutze ich das py-Script und keinen MTA, kann nur das Script Mails versenden. Aber gut, viele Wege führen nach Rom, jeder muss seinen eigenen finden.
@franz: was ist bc in Zeile 4? Wird bei mir angemeckert. SSMTP konnte ich in 2 Minuten gem http://www.raspberry-projects.com/pi/software_utilities/email/ssmtp-to-send-emails zum laufen bringen, das ist wirklich auch für mich Anfänger super easy. Um einen gmail-Account zu nutzen, musste ich lediglich unter https://www.google.com/settings/security/lesssecureapps genehmigen, dass Programme sich mit weniger sicheren Methoden anmelden dürfen – kein Problem bei einer dedizierten E-Mail-Adresse.
Das Programm bc ist eine interaktive Algebrasprache.
Hm, ich hatte hier geantwortet, die Antwort ist weg. Nun denn. Ich hatte bc als Rechner bezeichnet, ist etwas einfacher als „interaktive Algebrasprache 🙂 bc bezeichnet sich selbst als „The GNU bc arbitrary precision calculator language“ und ist in den Paketquellen enthalten. sudo apt-get install bc installiert es. Ich setze es in dem Script nur ein, um die Ausgabe in Milligrad in Grad umzurechnen, damit mir die Temperatur korrekt im Mail-Subject angegeben wird. Grundsätzlich ist es hier verzichtbar und dient nur der Kosmetik.
Hallo Franz,
im Mailtext + Mailbetreff steht die falsche Variable drin, mit $tempC wirds richtig in °C ausgegeben.
Eine Prima Lösung, grade wo ich vorher einen MTA installiert hatte…
Hallo Stefan,
ja, völlig richtig. Da habe ich mich verschrieben.
Hallo
Dein Script funktioniert super, nur werden bei mir die Prozesse nicht angezeigt, es steht bei mit %CPU Prozess und dann nichts mehr, wie kann ich das beheben?
Danke
Hm, schwer zu sagen auf die Entfernung. Sieht so aus, als würden die Variablen nicht richtig abgefragt.
Funktionieren denn die Befehle:
cat /sys/class/thermal/thermal_zone0/temp
ps -Aeo „%C %c“ | awk ‚{ if (int($1) > 1) { print $0 } }‘
[…] Ich habe immer den Wunsch jegliches System so ordentlich wie möglich zu überwachen. Da ich den RPi ja auch als “NAS” verwende, habe ich entsprechende Programme/Scripte gesucht. Ein schickes Script die Temperatur zu überwachen findet Ihr inkl. Anleitung hier: https://jankarres.de/2013/12/raspberry-pi-ueberwachen-mit-monitoring/ […]
Hallo,
ich habe mich mit dem Python Script versucht. Ich bekomme aber folgende Fehlermeldung:
Traceback (most recent call last):
File „/home/pi/GUI/GUI-Test_mail.py“, line 84, in
server.sendmail(mailSender, mailReceiver, msg.as_string())
File „/usr/lib/python2.7/smtplib.py“, line 722, in sendmail
raise SMTPSenderRefused(code, resp, from_addr)
smtplib.SMTPSenderRefused: (550, ‚Requested action not taken: mailbox unavailable\nInsufficient security or privacy level.‘, ‚[email protected]‘)
Ich nutze Web.de Weiß jemand was dies bedeutet?
Hast Du Zeile 32 im Script auskommentiert? Kann sein, dass web.de zwingend verschlüsseln möchte.
Hey, mein Fehler lautet wie folgt:
Traceback (most recent call last):
File “monitoring-cpu-temp.py”, line 26, in
server = smtplib.SMTP(smptHost, smtpPort)
File “/usr/lib/python2.7/smtplib.py”, line 249, in _init_
(code, msg) = self.connect(host, port)
File “/usr/lib/python2.//smtplib.py”, line 309, in connect
self.sock = self._get_socket(host, port, self.timeout)
File “/usr/lib/python2.7/smtplib.py”, line 284, in _get_socket
return socket.create_connection((port, host), timeout)
File “/usr/lib/lib/python2.7/socket.py”, line 571, in create_connection
raise err
socket.error: [Errno 110] Connection timed out
kann mir da jemand weiterhelfen.
Danke
[…] Grundidee vom Skript: JanKarres […]
Du könntest das noch anpassen das es über PushBullet läuft 🙂
Das würde mir gefallen.
Python ist nicht so meine Stärke, weshalb das in nächster Zukunft auf jeden Fall nicht passieren wird 😛
Hab zum Test mal die Warnungs-Temperatur auf 30 Grad gestellt und keine Mail bekommen. Das Script habe ich dann per Hand ausgeführt und folgende Meldung erhalten:
Traceback (most recent call last):
File „monitoring-cpu-temp.py“, line 20, in
date = „%02i.%02i.%04i“ % (int(time.localtime()[2]), int(time.localtime()[1]), int(time.localtime()[0]))
NameError: name ‚time‘ is not defined
Was ist denn da falsch gelaufen?
Wäre super, wenn mir ja jemand helfen könnte!
Grüße
Philipp
Evl. ist etwas beim Kopieren des Scriptes schief gegangen? Ich würde es einfach versuchen noch einmal anzulegen.
Hallo Grüße,
ich habe hier folgende Probleme:
### Settings
# SMTP
smptHost = „Gmail.com“
smtpPort = 587
smtpUser = „???“ Username oder meine email-adresse?
smtpPassword = „???“ Meine ganz normale Gmail-Daten?
# E-Mail
mailSender = „[email protected]“
mailReceiver = „[email protected]“
Wäre es so korrekt?
Wenn ich das Skript starte kommt keine Fehlermeldung. Es beendet sich aber nicht und es wird keine email gesendet. Habe de´n kritischen Wert extra auf 2°C gesetzt um sicher zu gehen.
Muss ich für das Skript noch eine Portweiterleitung am Raspberry oder an meinem Router vornehmen?
Ich hoffeihr könnt mir helfen.
cia
Du musst im Falle von Google Mail deine ganz normalen Zugangsdaten angeben. Portweiterleitungen sind nicht notwendig.
Vielen Dank für das Skript!
Super, läuft auf anhieb.
Wird hier jetzt eigentlich Nutzername und Passwort im Klartext übertragen?
Gruß
Das Script arbeitet so wie dargestellt unverschlüsselt. Benutzername und Passwort gehen also im Klartext über die Leitung. Wenn Du in Zeile 32 das „# “ am Anfang entfernst, arbeitet es per TLS verschlüsselt (ich habe es nicht gestestet).
Ah, Danke.
Es geht. Jedenfalls werden Emails versendet.
Ob die Mails verschlüsselt verschickt werden, kannst Du in den Kopfzeilen der Mail nachschauen. Dort müssten sich Zeilen wie:
Received: from [111.222.33.44] (helo=domain.de)
by smtpserver.provider.de with esmtpsa (TLSv1:AES128-SHA:128)
finden.
So etwa? 🙂
from [127.0.1.1] (u78A7K5CD.dip0.adresse.de [IP]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by -xxxxxserver.de (Postfix) with ESMTPSA id 4A07CA126 for … datum usw
Das sieht doch gut aus. So einfach kann das Leben sein 😉
Hallo zusammen,
was muss ich tun, wenn bei der Ausführung des Scripts folgender Fehler auftritt:
Traceback (most recent call last):
File „monitoring-cpu-temp.py“, line 33, in
server.login(smtpUser, smtpPassword)
File „/usr/lib/python2.7/smtplib.py“, line 585, in login
raise SMTPException(„SMTP AUTH extension not supported by server.“)
smtplib.SMTPException: SMTP AUTH extension not supported by server.
Vielen Dank im Vorraus
LG
Tante Google spuckt zu Deiner Fehlermeldung eine Menge aus. Versuche mal nach Zeile 31 im Script
server.connect(„smtp.example.com“,465)
Hallo Jan,
gibt es eine möglichkeit das Script zu testen, weiß gerade nicht ob es auch richtig läuft.
[…] Ich habe immer den Wunsch jegliches System so ordentlich wie möglich zu überwachen. Da ich den RPi ja auch als „NAS“ verwende, habe ich entsprechende Programme/Scripte gesucht. Ein schickes Script die Temperatur zu überwachen findet Ihr inkl. Anleitung hier: http://jankarres.de/2013/12/raspberry-pi-ueberwachen-mit-monitoring/ […]