Raspberry Pi - Einstieg, Optimierung, Projekte
10 gpio -g mode $i out
- gpio -g write $i 0
- done
- }
-
15 set_led()
- {
- led_status=`gpio -g read $1`
- if [
"
$led_status
"
-ne 1 ]
- then
20 init_leds
- gpio -g write $1 1
- fi
- }
-
25 cleanup()
- {
- init_leds
- exit 0
- }
30
- init_leds
- trap cleanup INT TERM EXIT
Die ersten drei Zeilen definieren Konstanten für die GPIO-Pins, an die Sie die LEDs angeschlossen haben. Beachten Sie, dass die Zahlen in den Konstanten sich auf die Pinbezeichnungen GPIO18, GPIO23 und GPIO24 beziehen. Sie beziehen sich nicht auf die Pinnummern der Erweiterungsanschlüsse 12, 16 und 18.
Die Funktion
init_leds()
in Zeile 6 setzt den Modus für alle drei LEDs auf Ausgabe und schaltet sie aus. Die Funktion
set_led()
schaltet eine bestimmte LED ein und die anderen aus. Bevor die LED eingeschaltet wird, prüft sie, ob die LED nicht schon brennt. Das stellt sicher, dass die LED nicht flackert, wenn sich der Status nicht verändert hat. Die Funktion
cleanup()
schließlich schaltet alle LEDs aus und beendet das Programm.
Um das Programm zu initialisieren, müssen Sie
init_leds()
aufrufen. Um sicherzustellen, dass das Programm aufräumt, bevor es anhält, verwenden Sie die
trap
-Anweisung in Zeile 32. Dieser Befehl bindet die Methode
cleanup()
an die meisten üblichen Stoppsignale. Wenn Sie also das Skript anhalten, räumt es auf, bevor es sich beendet.
Jetzt haben wir alles richtig initialisiert und Sie können die Alarmlogik programmieren. Dazu müssen wir einen Weg finden, den aktuellen Speicherstatus des Pi zu ermitteln. Der Befehl
free
ist dazu perfekt geeignet.
pi@raspberry:~$
free
total used free shared buffers cached
Mem: 190836 40232 150604 0 6252 21068
-/+ buffers/cache: 12912 177924
Swap: 0 0 0
Um den Prozentwert des verfügbaren Speichers zu berechnen, müssen wir die Menge des Gesamtspeichers und die Menge des freien Speichers aus der Ausgabe des Befehls
free
ausschneiden. Danach müssen wir auf Basis des Prozentwerts die richtige LED einschalten. Das funktioniert folgendermaßen:
gpio/memwatch.sh
Zeile 1 while :
- do
- total=`free | grep Mem | tr -s ' ' | cut -d ' ' -f 2`
- free=`free | grep Mem | tr -s ' ' | cut -d ' ' -f 4`
5 available=$(( free * 100 / total ))
- echo -n
"
$available% of memory available ->
"
-
- if [
"
$available
"
-le 10 ]
- then
10 echo
"
Critical
"
- set_led $red
- elif [
"
$available
"
-le 30 ]
- then
- echo
"
Low
"
15 set_led $yellow
- else
- echo
"
OK
"
- set_led $green
- fi
20 sleep 10
- done
Der Speichermonitor sollte den aktuellen Speicherstatus regelmäßig prüfen, sodass die gesamte Logik in einer Endlosschleife läuft. Die Zeilen 3 bis 5 berechnen den Prozentwert des freien Speichers, indem sie den Befehl
free
zweimal aufrufen und die relevante Information ausschneiden. Diese Lösung hat eine potenzielle Fehlerquelle. Wenn sich der aktuelle Speicherverbrauch zwischen zwei
free
-Aufrufen signifikant ändert, stimmen die Ergebnisse nicht mehr. Das ist zwar nicht sehr wahrscheinlich, kann aber passieren. Bei einem Produktionssystem müssten wir einen zuverlässigeren Weg finden, um die Speicherbelegung zu ermitteln. Für einen Prototyp reicht diese Vorgehensweise aber aus.
Die folgenden Zeilen vergleichen den verfügbaren Speicher mit ein paar Schwellwerten. Ist der verfügbare
Weitere Kostenlose Bücher