Systemwerte des Raspberry Pi (allg. Linux) in einer Datenbank aufzeichnen
Um meinen Raspberry Pi virtuell im Blick zu haben bzw. allgemein beobachten zu können wie er sich verhält wenn ich ihm neue Aufgaben gebe lasse ich ihn alle 5 Minuten diverse Systemwerte in eine externe Datenbank schreiben.
Ursprünglich hatte ich an eine lokale sqlite Datenbank gedacht, das dürfte die SD-Karte aber sehr stressen und letztlich zerstören. Also habe ich mich für eine Datenbank bei meinem Webhoster entschieden. Ein zufällig generiertes Kennwort mit 28 Stellen sollte dafür sicher genug sein
Was ich hier beschreibe ist zwar auf den Raspberry Pi bezogen, letztlich aber Linux-Universell. Auf einem “richtigen” Linuxsystem könnte man es genauso machen wenn man wollte, nur die Temperatur müsste anders abgefragt werden.
Zur Vorbereitung muss natürlich erstmal die Datenbank angelegt werden. Das habe ich vom Pi aus gemacht um die Verbindung zu testen und damit es hier im Blog auch universeller ist
Auf der Befehlszeile schickt folgende Zeile (es gehört alles in eine Zeile!) den SQL Befehl zum anlegen der Datenbank an den MySQL/MariaDB Server:
echo "USE [datenbankname]; CREATE TABLE systemwerte (id int auto_increment primary key, host varchar (32), date int unsigned, temp float unsigned, powerontime timestamp, load1 float unsigned, load5 float unsigned, load15 float unsigned, freq float unsigned, memtot int unsigned, memuse int unsigned, memfree int unsigned, numproc int unsigned, conntrack int unsigned, numloguser smallint unsigned, loggedinuser varchar(100));" | mysql -u[benutzername] -p[kennwort] -h[server]
Um die Systemwerte nun automatisch in die Datenbank zu schreiben habe ich das Verzeichnis /root/bin/ angelegt und darin ein kleines Script systemwerte_mysql.sh gepackt:
#!/bin/bash(Das sind zwei Zeilen, das “echo…” ist eine Zeile)
echo "USE [datenbankname]; INSERT INTO systemwerte (host,date,temp,powerontime,load1,load5,load15,freq,memtot,memuse,memfree,numproc,conntrack,numloguser,loggedinuser) VALUES ('`hostname`',`date +"%s"`,`awk '{print $1/1000}' /sys/class/thermal/thermal_zone0/temp`,'`uptime -s`',`awk '{print $1,\",\",$2\",\",$3 }' /proc/loadavg`,`awk '{print $1/1000}' /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq`,`free|head -2|tail -1|awk '{print $2\",\"$3\",\"$4}'`,`ps aux|wc -l`,`cat /proc/sys/net/ipv4/netfilter/ip_conntrack_count`,`who|wc -l`, '`who -q|head -1`')" | mysql -u[benutzername] -p[kennwort] -h[server]
Das Script wird mit einem chmod 700 nur noch für root lesbar gemacht (es enthält die Zugangsdaten für die Datenbank im Klartext!) und alle 5 Minuten per cron aufgerufen. Als root1 ruft man dafür crontab auf und gibt folgende Zeile ein:
*/5 /root/bin/systemwerte_mysql.shDas ruft nun alle 5 Minuten das Script auf das diverse Systemwerte in die Datenbank schreibt. Bei einem Problem oder wenn ich dem Pi neue Aufgaben gebe kann ich so nachvollziehen ob ihn etwas belastet.
Als Tabelle sieht das dann so aus:
id | host | date | temp | powerontime | load1 | load5 | load15 | freq | memtot | memuse | memfree | numproc | conntrack | numloguser | loggedinuser |
3050 | raspi1 | 1391255401 | 48.692 | 2014-01-28 19:40:01 | 0.06 | 0.07 | 0.06 | 700 | 473864 | 325920 | 147944 | 96 | 200 | 1 | rowi |
3049 | raspi1 | 1391255101 | 48.154 | 2014-01-28 19:40:01 | 0 | 0.03 | 0.05 | 700 | 473864 | 326004 | 147860 | 95 | 147 | 1 | rowi |
3048 | raspi1 | 1391254802 | 48.154 | 2014-01-28 19:40:01 | 0.03 | 0.04 | 0.05 | 700 | 473864 | 325508 | 148356 | 95 | 167 | 1 | rowi |
3047 | raspi1 | 1391254501 | 48.692 | 2014-01-28 19:40:01 | 0 | 0.03 | 0.05 | 700 | 473864 | 325176 | 148688 | 96 | 142 | 1 | rowi |
3046 | raspi1 | 1391254201 | 48.154 | 2014-01-28 19:40:01 | 0.12 | 0.09 | 0.07 | 700 | 473864 | 325144 | 148720 | 96 | 364 | 1 | rowi |
Bisher hatte ich noch keinen Problemfall, falls der mal eintritt und mir etwas fehlt werde ich die Tabelle entsprechend erweitern. Freier Plattenplatz oder die letzten Zeilen von dmesg vielleicht. Aber das kommt wenn es so weit ist.
________
1 mein Pi läuft mit Arch Linux, da habe ich noch einen klassischen root User. Unter Raspbian entsprechend mit sudo ausführen.
Kommentare
Ansicht der Kommentare: Linear | Verschachtelt