RPi Systemstatus in Python

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Ich hatte heute Langeweile, dabei ist das hier herausgekommen:

    Alle Werte sind Python3 (für 2.7 sind kleine Änderungen notwendig) als Variablen weiterverarbeitsbar, bei Interesse lasst mal nen Post da, dann bekomm ich Lust ein Tutorial zu bauen. :thumbs1:

    Das ganze geht mit Sicherheit noch viel hübscher, aber mir war es wichtiger erstmal alle Werte in Python zu haben, um diese dann weiterzuverarbeiten.

    Gruß
    secpri

    Einmal editiert, zuletzt von secpri (9. Juni 2014 um 19:40)

  • status.py:

    Happy copy & pasting :bravo2: , ggfls. ausführbar machen (chmod) und dann via "python3 status.py" ausführen.

    Die Eth Schnittstellen überarbeite ich gerade noch zum Wochenende, da hier ja auch UMTS Sticks, Wlan oder VPN Tunnel von Interesse sein könnten. Danach muss ich die Grafikkartensepicher nochmal nachgucken, da hakt es doch noch ab und zu.

    Auf PEP8 und ähnliches habe ich bis hierher mal noch keine Rücksicht genommen, da es spontan aus einer Laune heraus entstand und ich kein Python Pro bin :wallbash:.

    Verbesserungsvorschläge immer her damit :danke_ATDE:

  • ??? 28°C fetter Lüfter auf die CPU ? so wenig habe ich nie gesehen, ich kühle ja nur passiv und habe mit viel Tuning minimalst 38°C erreicht.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Wozu der irre Aufwand fuer all die Subprozesse ??

    > sec_sys_date = str(os.popen("date +'%d %b %Y'").readlines()).strip ("[\ ]'/n")
    > sec_sys_time = str(os.popen("date +'%T %Z'").readlines()).strip ("[\ ]'/n")
    Dafuer gibt's eine python-Funktionen die nur halb so kompliziert ist !

    Und was soll das /n ?? (Kommt auch auf den naechsten Zeilen vor)

    > sec_sys_uptime = str(timedelta(seconds = int(str(os.popen("cat /proc/uptime | awk -F '.' '{print $1}'").readlines()).strip ("[\ ]'/n"))))
    python kann selber Files lesen, und den String dann zu zerlegen duerfte auch nicht schwierig sein.

    > sec_sys_cpu = str(os.popen("cat /proc/cpuinfo | grep 'model name' | cut -c 14-75").readlines()).strip ("[\ ]'/n")
    Hier brauchts halt etwa vier Zeilen, dafuer keine Subprozesse

    Einmal editiert, zuletzt von Tell (12. Juni 2014 um 20:23)

    • Offizieller Beitrag

    es geht auch in einer zeile ohne subprocesse

    Code
    with open("/proc/cpuinfo") as f: print f.read().split(" bla bla bla" )...

    Ich weiß, es ist Haarspalterei. Ich freue mich für den TE das er was in python allein gebaut hat. Wie er das macht spielt am ende keine Rolle, solange das Ergebnis stimmt ;)

  • Es ist besser auf Konsolen Befehle so gut es geht zu verzichten und es möglichst nativ in der jeweiligen Sprache zu realisieren, das ist i.d.R. wesentlich schneller - also auf diese os. (subprocesse) Sachen verzichten ;)
    Das ist dann vielleicht etwas mehr Code, aber sowas wie 'cat' usw lieber mit öffnen des Files in Python umsetzen

    Und Bezüglich # Arbeitsspeicher: gibts auch bessere bzw schnellere Wege. Führ mal in der Konsole nur so als Vergleich Deine Befehl:

    Code
    top -b -n1 -d1 | grep 'KiB Mem:' | awk '{print $7}'


    Und dann diesen Befehl:

    Code
    free | grep Mem | awk {'print $4'}

    aus..
    Da wirst du merken das er für Deinen Befehl wesentlich länger brauch bis ne Ausgabe kommt :( Und das bremst dann halt dein python Script enorm aus da du das 4x machst
    Aber das schlimmste daran ist dass top 200kb Speicher frisst um den jeweiligen Wert auszugeben:

    Code
    root@strudel:~# top -b -n1 -d1 | grep 'KiB Mem:' | awk '{print $7}' ; free | grep Mem | awk {'print $4'} 
    12436
    12616
    root@strudel:~#

    Diese RAM Geschichte sähe in bash wie folgt aus:

    Code
    total=`free | grep Mem | awk {'print $2'}`
    memfree=`free | grep Mem | awk {'print $4'}`
    cachefree=`free | grep cache: | awk {'print $4'}`
    free=$(( memfree + cachefree ))
    available=$(( free * 100 / total ))

    Wie du siehst ist memfree nicht das selbe wie free , denn der tatsächlich freie Speicher setzt sich aus dem nicht belegten Speicher und dem Cache zusammen, da Linux ein anderes/besseres Speichermanagement hat und der Cache frei verwendbar is.
    Diese Werte stehen ausserdem auch in der Datei /proc/meminfo , deshalb solltest du lieber die Datei mit python öffnen und dir dort die Werte raus lutschen ;)

    Und btw is deine "Firmware" der Kernel aber nicht die firmware ;)

    Den GPU Speicher kannst du auch auslesen:

    Code
    for i in arm gpu; do /opt/vc/bin/vcgencmd get_mem $i; done

  • ??? 28°C fetter Lüfter auf die CPU ? so wenig habe ich nie gesehen, ich kühle ja nur passiv und habe mit viel Tuning minimalst 38°C erreicht.

    schaust du hier (Thread:(

    :danke_ATDE: für eure Rückmeldungen, ich werde eure Anregungen/Kritikpunkte/Verbesserungsmöglichkeiten in mein Wochenend update mit einfließen lassen.


    Warum diese ganzen Subprozesse:
    Ich wollte als Ziel alle Werte einheitlich als String Variable ohne weiteren schnickschnack haben, dazu in der von mir gewünschten Einheit (daher die Umrechnungen). Klar, das kostet Zeit, aber ob das nun 2 ms oder 10ms braucht stört mich derzeit noch nicht wirklich.

    Wenn ich so alle 5 Sekunden meine MySQL Datenbank damit fütter, könnte die Zeit irgendwann anfangen eine Rolle zu spielen, derzeit denke ich hält sich dass aber wohl noch im Rahmen.

    Beim Strippen der übergebenen Werte in die Variablen gibts bestimmt noch elegantere Wege, auf diese bin ich aber noch nicht gekommen :wallbash:

    Einmal editiert, zuletzt von secpri (12. Juni 2014 um 21:40)

  • Update:

    So wie versprochen mein Update zum Wochenende. Ich bin gespannt auf eure Rückmeldungen.

    :bravo2:

    Anmerkungen:

    - Beim Arbeitsspeicher hab ich auf das für mich notwendige beschränkt, da ließen sich ja noch etliche Details auslesen. Komischerweise rechnet Linux wohl auch mit 1.000 statt 1.024.

    - Netzwerkinterfaces:
    So viele wie ich gerade einbinden konnte und hier liegen hatte hab ich mal drangeklemmt. Der Gateway wird nur bei dem Interface angezeigt wo auch die entsprechende Flag gesetzt wurde.

    Alles in allem bin ich mit dem Ergebnis sehr zufrieden. :thumbs1:

    Einmal editiert, zuletzt von secpri (15. Juni 2014 um 14:01)

  • Hier noch ein kleiner Nachschlag:

    + Routing Table
    + Offene Ports
    + Laufzeit Timer

    :bravo2:

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!