Raspberry Pi: Überwachen mit Monitoring

12 Dez
12. Dezember 2013

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

RPi-Monitor

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.

Munin

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.

Step 1

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

Step 2

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

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.

Dir hat der Artikel gefallen?
Teile ihn mit deinen Freunden!
40 Antworten
  1. David K says:

    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

    Antworten
    • Jan Karres says:

      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 😉

      Antworten
    • Leon says:

      Ansonsten kannst du es ja etwas schützen mit chmod 660 monitoring-cpu-temp.py

      Antworten
  2. Markus says:

    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.

    Antworten
    • Jan Karres says:

      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? 😉

      Antworten
  3. Franz says:

    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!" mail@example.com
    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.

    Antworten
    • Jan Karres says:

      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 😉

      Antworten
      • Franz says:

        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.

        Antworten
        • Franz says:

          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.

          Antworten
        • Jan Karres says:

          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!

          Antworten
          • Franz says:

            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.

          • Leon says:

            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.

          • Franz says:

            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.

    • jan says:

      @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.

      Antworten
      • Franz says:

        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.

        Antworten
    • Stefan says:

      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…

      Antworten
      • Franz says:

        Hallo Stefan,

        ja, völlig richtig. Da habe ich mich verschrieben.

        Antworten
        • Martin says:

          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

          Antworten
          • Franz says:

            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 } }‘

  4. Broken_Mind says:

    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.‘, ‚raspi@email.de‘)

    Ich nutze Web.de Weiß jemand was dies bedeutet?

    Antworten
    • Franz says:

      Hast Du Zeile 32 im Script auskommentiert? Kann sein, dass web.de zwingend verschlüsseln möchte.

      Antworten
      • Kevin says:

        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

        Antworten
  5. Satras says:

    Du könntest das noch anpassen das es über PushBullet läuft 🙂

    Das würde mir gefallen.

    Antworten
  6. Philipp says:

    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

    Antworten
  7. alicedeh says:

    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 = „ziel@googlemail.com“
    mailReceiver = „ziel@googlemail.com“

    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

    Antworten
  8. Willi says:

    Vielen Dank für das Skript!
    Super, läuft auf anhieb.

    Wird hier jetzt eigentlich Nutzername und Passwort im Klartext übertragen?

    Gruß

    Antworten
    • Franz says:

      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).

      Antworten
      • Willi says:

        Ah, Danke.
        Es geht. Jedenfalls werden Emails versendet.

        Antworten
        • Franz says:

          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.

          Antworten
          • Willi says:

            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

  9. Franz says:

    Das sieht doch gut aus. So einfach kann das Leben sein 😉

    Antworten
  10. Gabriel says:

    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

    Antworten
    • Franz says:

      Tante Google spuckt zu Deiner Fehlermeldung eine Menge aus. Versuche mal nach Zeile 31 im Script

      server.connect(„smtp.example.com“,465)

      Antworten
  11. Manuel says:

    Hallo Jan,

    gibt es eine möglichkeit das Script zu testen, weiß gerade nicht ob es auch richtig läuft.

    Antworten

Trackbacks & Pingbacks

  1. Raspberry PI als Mediacenter mit USB-Festplatte | splitt-it.de sagt:

    […] 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/ […]

Antworten

Kommentar verfassen

JanKarres.de © 2007-2018