SHELL Wert in Datei speichern (Temperatur)
Moinsen liebe Community,
habe mir nen Raspberry Pi angeschafft und möchte die Temperatur auslesen und speichern(per Schell Script).
Das ganze soll dann theroretisch so aussehen:
Script liest Temperaur aus (/opt/vc/bin/vcgencmd measure_temp). Temperatur wird in eine Textdatei gespeichert.
Eig. ganz easy, bin nur zu blöd g.
Freu' mich auf antworten :)
MfG.
Lenni || Speedy309
4 Antworten
schreibe folgende Befehle in eine Datei ( beliebiger Name , im Beispiel script-datei)
als Shell-Script (dabei werden alle 60 Sekunden die Messwerte in die Datei temperatur geschrieben -angehängt)
while true
do
/opt/vc/bin/vcgencmd measure_temp >> temperatur
sleep 60
done
Mache diese Datei ausführbar
chmod 755 script-datei
und starte sie mit
./script-datei
Die (letzten) Ergebnisse kannst du dann mit
tail -f temperatur
jederzeit auslesen. Die Datei temperatur sollte dann aber auch hin und wieder mal gelöscht werden.
Ich habe es so gemacht, dass mir der Temperaturverlauf nicht in eine Datei geschrieben wird, sondern dass mir bei einer bestimmten Warnschwelle eine Mail geschickt wird.
#!/bin/bash
temp=$(cat /sys/class/thermal/thermal_zone0/temp)
prozesse=$(ps -Aeo "%C %c" | awk '{ if (int($1) > 1) { print $0 } }')
tempC=$(echo $temp/1000 | bc -l)
if (test "$temp" -ge 65000) && (test "$temp" != 85000)
then
echo -e "CPU-Temperatur $temp Grad - cat /sys/class/thermal/thermal_zone0/temp\n$tempC Grad\n%CPU Prozess\n$prozesse" | mail -s "Warnung: RasPi - CPU ist $temp Grad warm!" deine@mailadresse.example
fi
Dabei habe ich die Temperatur aus /sys/class/thermal/thermal_zone0/temp ausgelesen. Der dort ausgegebene Wert muss durch 1000 geteilt werden, um die Temperatur zu erhalten. Zusätzlich lasse ich mir die laufenden Prozesse, die mehr als 1 Prozent CPU fressen, mit ausgeben. Ich habe dann irgendwann mal festgestellt, dass ich "Fehlalarme" bekomme. Zwischenzeitlich habe ich Mails bekommen, die Temperatur wäre auf 85,000 Grad gestiegen. Die werden durch den obigen Code unterdrückt. Da, wo > steht, muss ein > hin - das vermurkst gf. Das Script wird dann per Cronjob alle 5 Minuten aufgerufen.
Alternativ in eine Datei schreiben, angereichert mit Zeitstempel und Prozessliste:
#!/bin/bash
# Temperatur auslesen
temp=$(cat /sys/class/thermal/thermal_zone0/temp)
# Temperatur in Grad Celsius umrechnen
tempC=$(echo $temp/1000 | bc -l)
# Datum und Zeit auslesen, Format festlegen
datum=$(date +%d.%m.%y)
zeit=$(date +%H:%M:%S)
# Prozessliste mit % CPU-Last (%C) und Prozessname (%c) auslesen, alle Prozesse mit CPU-Last > 1 Prozent ausfiltern
prozesse=$(ps -Aeo "%C %c" | awk '{ if (int($1) > 1) { print $0 } }')
echo "$datum" "$zeit" Temperatur: "$tempC" Prozesse: "$prozesse" >> /home/pi/temp.log
# Nullen in der Temperatur loeschen
sed -i -e 's*00000000000000000**g' /home/pi/temp.log
Auch hier ersetze > durch >. Wenn nur der Prozess mit der höchsten Prozessorlast ausgegeben werden soll, kann man
# Prozessliste mit % CPU-Last (%C) und Prozessname (%c) auslesen, sortieren und obersten Prozess ausgeben
prozesse=$(ps -Aeo "%C %c" | sort -k 1 -r | head -2 | grep [0-9])
verwenden.
Der Raspimonitor erlaubt übrigens eine lückenlose Überwachung der Temperatur und anderer Systemparameter über ein Webinterface.
In Annahme, dass das von Dir verwendete Programm die gesuchte Temperatur auf die Standardausgabe schreibt, kannst du einfach den entsprechenden Standard-Datenstrom (In diesem Fall dann stdout) in eine Datei umlenken.
/opt/vc/bin/vcgencmd measure_temp > /path/to/file
Siehe auch: http://de.wikipedia.org/wiki/Standard-Datenstr%C3%B6me
MfG
Schard
Es ginge auch mit einem 1-Zeiler
watch -n 30 "/opt/vc/bin/vcgencmd measure_temp >> /pfad/zum/tempfile.log";
wenn du > anstatt >> verwendest hast du immer nur die aktuelle Temperatur in der Datei.
mit -n 30 kann man das Intervall in Sek. angeben... in dem Fall zB 30!
Du hast doch mehrere Konsolen...
Nutze entweder einen Cron-Job (ohne watch natürlich, also nur den Befehl zwischen " und ") um das immer laufen zu lassen oder führ watch einfach auf einer eigenen Konsole aus!
Alternativ kannst du das Script von gunterhalt verwenden und es mit
bash scriptname.sh &
starten!
Funzt super :-)
Ist es auch möglich diese Operation im hintergrund laufen zu lassen?
MfG.
Lenni || Speedy309