Speicheranzeige des RAM Speichers mittels LED - Speicherampel

  • So hier kommt nun auch mal ein Tutorial von mir.

    In diesem Tutorial geht es dadrum, eine Optische Anzeige des RAM - Speichers zu bewerkstelligen. Die Anzeige besteht aus 3 LEDs (je eine in Rot, Gelb und Grün).

    Die Grüne LED läuchtet solange der genug freier Speicher vorhanden ist. Die Gelbe LED läuchtet auf, sobald der Speicher unter 30% sinkt. Die Rote LED läuchtet auf, sobald weniger als 10% des Speichers noch zur Verfügung steht.

    Solange das Programm im Aktiven Fenster läuft wird dadrüber hinaus noch eine Ausgabe angezeigt.

    Damit dies auch auf Dauer weiterläuft und man trotzdem weiter arbeiten kann zeig ich euch noch wie man das Programm in den Hintergrund legen kann.

    So erstmal vielleicht vorab ein Bild, damit man sieht wie sowas aussehen kann:

    Die LEDs werden über folgendes Script angesteuert:

    Nach dem Speichern des Scripts muss dies noch ausführbar gemacht werden mittels:

    Code
    chmod a+x memwatch.sh

    Und danach wie folgt das Script starten:

    Code
    ./memwatch.sh
    
    
    Zum Beenden des Scriptes Strg und C Taste drücken

    Die LEDs habe ich mit je einem Vorwiderstand von 150 Ohm ausgestattet und schalte diese über ein ULN2803 gegen 5V um die GPIO Pins nicht zu sehr zu belasten.

    Das ganze sieht wie folgt aus:

    2803led.jpg

    Um nun das Programm in einen Dienst zu überführen muss folgendes eingegeben werde:

    Code
    nohup ./memwatch.sh &

    Um diesen Dienst wieder zu beenden muss man erstmal die PID herrausfinden und dann diese Beenden:

    Code
    ps ax | grep memwatch.sh
    kill <pid>

    Natürlich wäre noch Vorteilhaft, wenn das Programm automatisch beim Neustarten gestarten wird und dies erledigt man wie folgt:

    • Öffnen der Datei: /etc/rc.local mit dem Editor der Wahl
    • Folgende Zeile ans Ende aber vor der Zeile "exit 0" einfügen: nohup <PfadZumScrip>/./memwatch.sh anfügen


    So jetzt kommt noch der Teil mit der Webansicht des Speicherzustandes. Diese sieht vom Code her wie folgt aus und muss lediglich ins Verzeichnis des Webservs gepackt werden oder den Code in eine bestehende Homepage ein zu binden.


    Ich hoffe, ich habe an alles gedacht und das interessiert den ein oder anderen.

    Für dieses Tutorial habe ich folgende Quellen dazu gezogen:


    Bitte um kleines Feedback über mein erstes Tutorial, was man ggf. verbessern könnte. Ich hoffe aber, dass es so aber im großen ganzen ganz Verständlich ist.


    Michael

    Der Raspberry Pi ist schon ein schönes Spielzeug mit dem man einiges anfangen kann.

    :angel: :wallbash:

    Einmal editiert, zuletzt von RaspiDo (11. März 2014 um 01:12)

  • Speicheranzeige des RAM Speichers mittels LED - Speicherampel? Schau mal ob du hier fündig wirst!

  • Gute Idee!

    Aber meines bescheidenen Erachtens nach, wertest du die falsche Zeile aus......

    Code
    pi@raspberrypi ~ $ free
                 total       used       free     shared    buffers     cached
    Mem:        448180     183996     264184          0      15464      98604
    -/+ buffers/cache:      69928     378252
    Swap:       102396          0     102396

    Die Zeile mit "-/+ buffers/cache" ist viel aussagekräftiger. Denn Linux belegt alles an Speicher, was es gibt für buffers und cache. Bei Bedarf werden diese dann verworfen und der Speicher steht voll für Anwendungen zur Verfügung.

    spruch.png

  • Eigentlich tat das Script grundsätzlich das, was es sollte. Also habe mal mehrere Anwendungen gestartet um die Auslastung hervor zu rufen.

    Aber man kann an sich ja alles anpassen, wie mans gerne hätte. :)


    Michael

    Der Raspberry Pi ist schon ein schönes Spielzeug mit dem man einiges anfangen kann.

    :angel: :wallbash:

  • Du hast glaub ich ein paar kleinere Fehler in deinem memwatch.sh

    Code
    if [ "$led_status" -ne 1

    Da fehlt das abschließende ]

    Ausserdem führst du init_leds aus aber in der set_led führst du es erneut aus :huh:


    Der Übersichtshalber würd ich auch das "then" nicht in die nächste Zeile tun sondern hinter die if, genauso wie bei der "for" Schleife:

    Code
    if [ "$led_status" -ne 1 ]; then
    for i in $green $yellow $red; do

    Und dann rückt man eigentlich den Code innerhalb solch einer Schleife nach rechts ums eindeutig darzustellen welcher Code in der Schleife steht, also nicht:

    Code
    for i in $green $yellow $red
        do
        gpio -g mode $i out
        gpio -g write $i 0
        done

    Sondern:

    Code
    for i in $green $yellow $red; do
            gpio -g mode $i out
            gpio -g write $i 0
        done

    Da gibts so wie ich das sehe aber auch ein Problem mit set_led, die LEDs werden nicht zurückgesetzt bzw nur wenn $led_status 'not equal' 1 ist...


    Desweiteren muss ich mich combie anschließen, du wertest leider die falschen Zeilen von free aus - was ich dir anhand eines Beispiels zeigen kann:

    Code
    root@test ~ > free; total=`free | grep Mem | tr -s ' ' | cut -d ' ' -f 2`; free=`free | grep Mem | tr -s ' ' | cut -d ' ' -f 4`; available=$(( free * 100 / total ))
                 total       used       free     shared    buffers     cached
    Mem:        239136     223548      15588          0      62380      98796
    -/+ buffers/cache:      62372     176764
    Swap:       133112        604     132508
    root@test ~ > echo $total; echo $free; echo $available
    239136
    15256
    6
    root@test ~ >

    Das stimmt aber nicht, es sind nicht nur 15256 byte frei sondern frei verwendbar sind 176764 byte eben durch den Cache und somit auch nicht nur 6 % available sondern mindestens 60% :)

    Du darfst also nicht nur die "Mem:" Zeile beachten :D


    Und dann zu dem "In den Hintergrund":

    Code
    nohup ./memwatch.sh &

    Das & ist hierbei eigentlich zu viel, das kann man auch weg lassen ;) Bzw führt dies zum nachfolgenden Problem bezüglich /etc/rc.local
    (das & brauch man nur wenn man mit der aktuellen Shell weiter arbeiten möchte)

    Und zu dem Beenden:

    Code
    ps ax | grep memwatch.sh
    kill <pid>

    Da kannste auch ein Einzeiler draus machen:

    Code
    kill `ps ax | grep memwatch.sh | awk {'print $1'}`


    Dann das einfügen in die /etc/rc.local:

    Code
    nohup <PfadZumScrip>/./memwatch.sh

    Das ist eigentlich quatsch, aus zweierlei Gründen:
    - Wenn man den vollständigen Pfad angibt brauch man kein " ./ " mehr
    - nohup brauch man hier nicht sondern eigentlich reicht hier ein " & " am Ende der Zeile

    Also besser wäre:

    Code
    /pfad/zum/memwatch.sh &


    Und bei deiner Webansicht fehlt der eigentliche HTML Code, also sowas wie <html><body> </body></html> :) Das sollte man mindestens haben, genau genommen sollte da aber noch mehr stehen um wirklich den HTML Richtlinien zu entsprechen sodass die Browser nix zu meckern haben und den Code auch korrekt interpretieren/darstellen

    Dann hast du in dem PHP Code aber leider auch ein paar Fehler, so fehlt zum Beispiel beim "shel_exec" das zweite l denn eigentlich heißt der Befehl -> shell_exec
    Davon ab ist das aber auch nicht möglich für den normalen www-data Benutzer das gpio Programm auszuführen, es sei denn man nutzt sudo und gibt ihm die Rechte, oder der www-data Benutzer ist Mitglied der gpio Gruppe ;)
    Aber hier auch noch ein Schreibfehler -> /user/local/bin/gpio ... /user/ gibts nicht, das heißt eigentlich /usr/local/bin/gpio


    Dann wär halt noch die Sache das man in sowohl memwatch.sh als auch PHP Script die GPIO Ports einstellen muss - das könnte man ggf auch ein bischen erleichtern zB indem das PHP Script das bash Script ausliest und variablen in " " einliest :)


    Ansonsten ist die Idee aber nicht schlecht :thumbs1:

  • Also mein Verbesserungsvorschlag wäre:


    Den Webserver Benutzer www-data der Gruppe gpio hinzufügen um vollen Zugriff auf die virtuellen gpio Dateien zu haben:

    Code
    usermod -G gpio -a www-data

    Optional den normalen Benutzer pi der Gruppe gpio hinzufügen um vollen Zugriff auf die virtuellen gpio Dateien zu haben (falls ihr das memwatch.sh Script nicht als root (sudo) ausführt):

    Code
    usermod -G gpio -a pi

    /usr/bin/memwatch.sh

    Spoiler anzeigen

    /var/www/memwatch.php

    Spoiler anzeigen


    In dem PHP Script müssen keine Änderungen vorgenommen werden, auch nicht wenn ihr andere GPIO ports nutzt - es sei denn das bash Script würde wo anders liegen als /usr/bin/memwatch.sh

    In dem memwatch.sh wird dann auch der tatsächlich freie Speicher (free mem + free cache) beachtet.

    Ausserdem brauch man kein wiringPI ;)

  • Danke für die vielen Feedbacks.

    Werde es mir für die Zukunft zu herzen nehmen und beim Tippen und übertragen versuchen die "Tippfehler" und das "Einrücken" besser bzw. korrekter zu machen.

    Werde es die Tage oben noch "verbessern" / korrigiere, denke macht Sinn, den der ein oder andere liest manchmal nur den obere Beitrag durch und dann sollte es vernünftig aussehen.


    Michael

    PS: Und zu der Elektronikfrage, da könntest du auch alternativ Transistoren oder so nehmen. Ich hab nur das ULN2803 genommen, da es am einfachsten an zu steuern ist. Müsstest dies bezüglich hier mal im Forum nachgucken.

    Der Raspberry Pi ist schon ein schönes Spielzeug mit dem man einiges anfangen kann.

    :angel: :wallbash:

    Einmal editiert, zuletzt von RaspiDo (3. März 2014 um 19:51)

  • Eine Frage, kann mir jemand evtl. verraten, wie ich diese Spoiler hin bekomme? Also damit die Codes nicht immer gleich so irre groß sind.


    Michael

    Der Raspberry Pi ist schon ein schönes Spielzeug mit dem man einiges anfangen kann.

    :angel: :wallbash:

  • Mir sind die Spoiler nicht geheuer....

    Aber wenn du auf "zitieren" klickst, bei einer Antwort, welche Spoiler enthält, siehst du wie sie notiert werden.


    Also:
    [*spoiler]

    Langer Text.

    [*/spoiler]
    **** Ich habe 2 Sterne eingefügt, um die automatische Verspoilerung abzuwenden ****

    spruch.png

    Einmal editiert, zuletzt von combie (6. März 2014 um 22:24)

  • Habe das jetzt mal Nachgebaut und beim Ausführen kriege ich diese Fehlermeldung:

    Spoiler anzeigen


    [font="Monaco, Consolas, Courier, monospace"]./memwatch.sh: Zeile 16: gpio: Kommando nicht gefunden.[/font]
    [font="Monaco, Consolas, Courier, monospace"]./memwatch.sh: Zeile 17: gpio: Kommando nicht gefunden.[/font]
    [font="Monaco, Consolas, Courier, monospace"]./memwatch.sh: Zeile 16: gpio: Kommando nicht gefunden.[/font]
    [font="Monaco, Consolas, Courier, monospace"]./memwatch.sh: Zeile 17: gpio: Kommando nicht gefunden.[/font]
    [font="Monaco, Consolas, Courier, monospace"]./memwatch.sh: Zeile 16: gpio: Kommando nicht gefunden.[/font]
    [font="Monaco, Consolas, Courier, monospace"]./memwatch.sh: Zeile 17: gpio: Kommando nicht gefunden.[/font]
    [font="Monaco, Consolas, Courier, monospace"]11% of memory available -> Low[/font]
    [font="Monaco, Consolas, Courier, monospace"]./memwatch.sh: Zeile 25: gpio: Kommando nicht gefunden.[/font]
    [font="Monaco, Consolas, Courier, monospace"]./memwatch.sh: Zeile 26: [: Fehlende `]'[/font]
    [font="Monaco, Consolas, Courier, monospace"]^C./memwatch.sh: Zeile 16: gpio: Kommando nicht gefunden.[/font]
    [font="Monaco, Consolas, Courier, monospace"]./memwatch.sh: Zeile 17: gpio: Kommando nicht gefunden.[/font]
    [font="Monaco, Consolas, Courier, monospace"]./memwatch.sh: Zeile 16: gpio: Kommando nicht gefunden.[/font]
    [font="Monaco, Consolas, Courier, monospace"]./memwatch.sh: Zeile 17: gpio: Kommando nicht gefunden.[/font]
    [font="Monaco, Consolas, Courier, monospace"]./memwatch.sh: Zeile 16: gpio: Kommando nicht gefunden.[/font]
    [font="Monaco, Consolas, Courier, monospace"]./memwatch.sh: Zeile 17: gpio: Kommando nicht gefunden.[/font]
    [font="Monaco, Consolas, Courier, monospace"]./memwatch.sh: Zeile 16: gpio: Kommando nicht gefunden.[/font]
    [font="Monaco, Consolas, Courier, monospace"]./memwatch.sh: Zeile 17: gpio: Kommando nicht gefunden.[/font]
    [font="Monaco, Consolas, Courier, monospace"]./memwatch.sh: Zeile 16: gpio: Kommando nicht gefunden.[/font]
    [font="Monaco, Consolas, Courier, monospace"]./memwatch.sh: Zeile 17: gpio: Kommando nicht gefunden.[/font]
    [font="Monaco, Consolas, Courier, monospace"]./memwatch.sh: Zeile 16: gpio: Kommando nicht gefunden.[/font]
    [font="Monaco, Consolas, Courier, monospace"]./memwatch.sh: Zeile 17: gpio: Kommando nicht gefunden.[/font]
    [font="Monaco, Consolas, Courier, monospace"]

    [/font]

    Wie kommt das?

    Gruss Nico


  • Habe das jetzt mal Nachgebaut und beim Ausführen kriege ich diese Fehlermeldung:

    Code
    ./memwatch.sh: Zeile 16: gpio: Kommando nicht gefunden.
    
    
    ./memwatch.sh: Zeile 26: [: Fehlende `]'
    
    
    ./memwatch.sh: Zeile 17: gpio: Kommando nicht gefunden.

    In Beitrag #5 hab ich die Fehler aus dem ersten Beitrag aufgeführt und korrigiert. Desweiteren setzt das Script von RaspiDo -> wiringPI voraus

    Du könntest auch mein Codevorschlag aus Beitrag#6 nutzt, da sind die Fehler behoben und es wird kein wiringPI benötigt, und die Speicherauslastung ist dort ebenfalls korrekt ;)

  • Okay habe deine Lösung genommen jetzt kommt das immer:

    Spoiler anzeigen


    ./memwatch.sh: Zeile 13: /sys/class/gpio/gpio17/direction: Keine Berechtigung
    ./memwatch.sh: Zeile 14: /sys/class/gpio/gpio17/value: Keine Berechtigung
    ./memwatch.sh: Zeile 13: /sys/class/gpio/gpio18/direction: Keine Berechtigung
    ./memwatch.sh: Zeile 14: /sys/class/gpio/gpio18/value: Keine Berechtigung
    ./memwatch.sh: Zeile 13: /sys/class/gpio/gpio4/direction: Keine Berechtigung
    ./memwatch.sh: Zeile 14: /sys/class/gpio/gpio4/value: Keine Berechtigung
    90% of memory available -> OK
    ^C./memwatch.sh: Zeile 13: /sys/class/gpio/gpio17/direction: Keine Berechtigung
    ./memwatch.sh: Zeile 14: /sys/class/gpio/gpio17/value: Keine Berechtigung
    ./memwatch.sh: Zeile 13: /sys/class/gpio/gpio18/direction: Keine Berechtigung
    ./memwatch.sh: Zeile 14: /sys/class/gpio/gpio18/value: Keine Berechtigung
    ./memwatch.sh: Zeile 13: /sys/class/gpio/gpio4/direction: Keine Berechtigung
    ./memwatch.sh: Zeile 14: /sys/class/gpio/gpio4/value: Keine Berechtigung

    Rechte habe ich so vergeben wie im Ersten Beitrag nur halt im /usr/bin Ordner.

  • Ich behaupte mal das du das Script als Benutzer pi ausgeführt hast :huh:

    Genau aus diesem Grund habe ich gerade noch mal Beitrag#6 bearbeitet und eine Optionale Zeile ergänzt... Bitte führ das mal aus - ansonsten führ das Script über sudo aus

  • Den Befehl habe ich natürlich als sudo gestartet. Damit kam trz die Meldung wenn ich aber sudo -s erst mache und dann nochmal Starte klappt es.

    Habe das jetzt mal gemacht:

    Code
    usermod -G gpio -a pi

    Trz wenn ich sudo ./memwatch.sh eingebe kommt die Nachricht mit der Fehlenden Berechtigung aber die LED´s leuchten trz habe es durch Auslasten des Rams getestet.

Jetzt mitmachen!

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