SHELL Wert in Datei speichern (Temperatur)

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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.

Woher ich das weiß:Berufserfahrung – openSuSE seit 1995

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!

Speedy309 
Fragesteller
 21.10.2013, 11:38

Funzt super :-)

Ist es auch möglich diese Operation im hintergrund laufen zu lassen?

MfG.

Lenni || Speedy309

0
mbauer588  21.10.2013, 11:53
@Speedy309

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!

0