Flummi
02-01-2006, 01:00
Hallo,
ich will mir gerne ein Skript schreiben, welches die Temperatur meiner
CPU überwacht und bei einer zu hohen Temperatur den Prozessor runter-
taktet. Auf Linuxforen.de hab ich dazu auch schon eine Frage gestellt und
habe das von ThorstenHirsch netterweise geschriebene Skript dazu be-
nutzt, ein eigenes anzufangen. Mit mäßigem Erfolg, wie man wohl sieht ;)
Die Idee ist recht simpel. Mein scaling_governor ist "powersave", was bewirkt,
dass die CPU immer auf der minimalen Stufe taktet. Mittels einer Abfrage wird
getestet, ob die Temperatur stimmt, wenn ja wird die CPU höher getaktet,
wenn nein, niedriger, und zwar indem die scaling_min_freq, also die minimal
zu taktende Frequenz eingestellt wird.
Hier also der Code dazu. Was passiert beim Ausführen? Nichts. Deshalb
meine Frage, was mache ich falsch?
#!/bin/bash
MAXTEMP=60
AVAIL_FREQ_1=600000
AVAIL_FREQ_2=800000
AVAIL_FREQ_3=1000000
AVAIL_FREQ_4=1200000
AVAIL_FREQ_5=1400000
AVAIL_FREQ_6=1700000
ECHO_FREQ=3
CURFREQ=`cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq`
while [ 1 ]; do
TEMP=`cat /proc/acpi/thermal_zone/THRC/temperature | awk '{ print $2 }'`
if [ "$TEMP" -gt "$MAXTEMP" ]; then
if [ "$ECHO_FREQ" -ge 2 ]; then
ECHO_FREQ=$(( $ECHO_FREQ - 1 ))
fi
case "ECHO_FREQ" in
1) echo $AVAIL_FREQ_1 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq; break ;;
2) echo $AVAIL_FREQ_2 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq; break ;;
3) echo $AVAIL_FREQ_3 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq; break ;;
4) echo $AVAIL_FREQ_4 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq; break ;;
5) echo $AVAIL_FREQ_5 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq; break ;;
6) echo $AVAIL_FREQ_6 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq; break ;;
esac
fi
if [ "$TEMP" -le "$MAXTEMP" ]; then
if [ "$ECHO_FREQ" -le 5 ]; then
ECHO_FREQ=$(( $ECHO_FREQ + 1 ))
fi
case "ECHO_FREQ" in
1) echo $AVAIL_FREQ_1 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq; break ;;
2) echo $AVAIL_FREQ_2 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq; break ;;
3) echo $AVAIL_FREQ_3 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq; break ;;
4) echo $AVAIL_FREQ_4 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq; break ;;
5) echo $AVAIL_FREQ_5 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq; break ;;
6) echo $AVAIL_FREQ_6 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq; break ;;
esac
fi
sleep 1
done
danke für eure Hilfe,
Flummi.
PS:
OS:GNU/Linux 2.6.14.5
Bash: 3.00
ich will mir gerne ein Skript schreiben, welches die Temperatur meiner
CPU überwacht und bei einer zu hohen Temperatur den Prozessor runter-
taktet. Auf Linuxforen.de hab ich dazu auch schon eine Frage gestellt und
habe das von ThorstenHirsch netterweise geschriebene Skript dazu be-
nutzt, ein eigenes anzufangen. Mit mäßigem Erfolg, wie man wohl sieht ;)
Die Idee ist recht simpel. Mein scaling_governor ist "powersave", was bewirkt,
dass die CPU immer auf der minimalen Stufe taktet. Mittels einer Abfrage wird
getestet, ob die Temperatur stimmt, wenn ja wird die CPU höher getaktet,
wenn nein, niedriger, und zwar indem die scaling_min_freq, also die minimal
zu taktende Frequenz eingestellt wird.
Hier also der Code dazu. Was passiert beim Ausführen? Nichts. Deshalb
meine Frage, was mache ich falsch?
#!/bin/bash
MAXTEMP=60
AVAIL_FREQ_1=600000
AVAIL_FREQ_2=800000
AVAIL_FREQ_3=1000000
AVAIL_FREQ_4=1200000
AVAIL_FREQ_5=1400000
AVAIL_FREQ_6=1700000
ECHO_FREQ=3
CURFREQ=`cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq`
while [ 1 ]; do
TEMP=`cat /proc/acpi/thermal_zone/THRC/temperature | awk '{ print $2 }'`
if [ "$TEMP" -gt "$MAXTEMP" ]; then
if [ "$ECHO_FREQ" -ge 2 ]; then
ECHO_FREQ=$(( $ECHO_FREQ - 1 ))
fi
case "ECHO_FREQ" in
1) echo $AVAIL_FREQ_1 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq; break ;;
2) echo $AVAIL_FREQ_2 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq; break ;;
3) echo $AVAIL_FREQ_3 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq; break ;;
4) echo $AVAIL_FREQ_4 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq; break ;;
5) echo $AVAIL_FREQ_5 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq; break ;;
6) echo $AVAIL_FREQ_6 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq; break ;;
esac
fi
if [ "$TEMP" -le "$MAXTEMP" ]; then
if [ "$ECHO_FREQ" -le 5 ]; then
ECHO_FREQ=$(( $ECHO_FREQ + 1 ))
fi
case "ECHO_FREQ" in
1) echo $AVAIL_FREQ_1 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq; break ;;
2) echo $AVAIL_FREQ_2 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq; break ;;
3) echo $AVAIL_FREQ_3 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq; break ;;
4) echo $AVAIL_FREQ_4 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq; break ;;
5) echo $AVAIL_FREQ_5 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq; break ;;
6) echo $AVAIL_FREQ_6 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq; break ;;
esac
fi
sleep 1
done
danke für eure Hilfe,
Flummi.
PS:
OS:GNU/Linux 2.6.14.5
Bash: 3.00