この日記は私的なものであり所属会社の見解とは無関係です。 GitHub: takahashikzn

ThinkPad600Xにもっと愛を

僕は自他共に認めるキーボードマニアなので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