僕は自他共に認めるキーボードマニアなのでThinkPad600X(CentOS 5.3)を愛用しているのですが、
CPUを高速なもの(と言ってもPen3 850MHzだけど)に交換しているため、この季節はCPU温度が70度近くになることもあります。
ただでさえ古いPCなのにこんな温度になってしまうと寿命(コンデンサとか)に悪影響が出るかもと思ったので、
CPUの温度に応じて処理速度を低下させるデーモンを作成しました。
と言ってもただのシェルスクリプトですが…
もっと良い書き方があったら教えてください(-_-)
本体(thermal_throttling)
#!/bin/sh #ACPI throttlingの制御ファイル THROTTLING=/proc/acpi/processor/CPU0/throttling #CPU温度取得用ファイル TEMPERATURE=/proc/acpi/thermal_zone/THM0/temperature #CPU温度ポーリング間隔 POLLING_INTERVAL=1 #ACPI throttlingの状態数 STATE_COUNT=8 #ACPI throttlingのステートと温度の対応表。 #左から順にT7, T6,... になる温度。 THRESHOLD_TEMPS='75 70 65 63 62 61 60 0' get_temperature() { sed -e 's/[^0-9]*//g' < $TEMPERATURE } get_state() { /bin/grep '\*' $THROTTLING | sed -e 's/.*T\([0-9]\).*/\1/g' } set_state() { if [ $1 != `get_state` ]; then echo -n $1 > $THROTTLING fi } start() { while(:); do sleep $POLLING_INTERVAL current_temperature=`get_temperature` i=$STATE_COUNT for threshold_temp in $THRESHOLD_TEMPS; do let i-- if (( $threshold_temp < $current_temperature )); then set_state $i break fi done done } start &
起動スクリプト
実は起動スクリプトの書き方はよくわかっていないのでかなり適当だったりします。
# starts the thermal_throttling Daemon # # chkconfig: 2345 05 98 # description: thermal_throttling # processname: thermal_throttling # config: # pidfile: /var/run/thermal_throttling.pid source /etc/rc.d/init.d/functions [ -x /usr/bin/svnserve ] || exit 1 RETVAL=0 USER=root prog="thermal_throttling" desc="Thermal Throttling Daemon" start() { echo -n $"Starting $desc ($prog): " daemon --user $USER $prog -d $OPTIONS RETVAL=$? [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog echo } stop() { echo -n $"Shutting down $desc ($prog): " # killproc $prog pkill 'thermal_throttl' RETVAL=$? [ $RETVAL -eq 0 ] && success || failure echo [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog return $RETVAL } case "$1" in start) start ;; stop) stop ;; restart) stop start RETVAL=$? ;; condrestart) [ -e /var/lock/subsys/$prog ] && restart RETVAL=$? ;; *) echo $"Usage: $0 {start|stop|restart|condrestart}" RETVAL=1 esac exit $RETVAL