CPUの熱管理

メモ

とりあえず CPU の発熱ってどう推移してるんだっけと思ったので、簡単にチェックしてみる。


今回 RRDTool とか入れてグラフ化…までは気合が入ってないので、シェルスクリプトで CPU 温度の推移を様子見したい。
まぁ、apt-get install cacti とかすれば、Apach/MySQL/PHP/RRDTool等々、関連するツールをドサドサ勝手にインストールしてくれて簡単に動作する環境が出来上がるんだけど…
MicroSD で動作するシステムだし、負荷は少しでも下げてあげたい。


(うん。sysstat を入れて10分毎に sar 情報を取得している人間の口から出たとは思えないね)

温度情報の取得方法

CPU 温度の取得方法は、いくつか見つけた。

OS からの情報 (bcでの処理)

まずは OS で管理している情報を取得する。

pi@raspberrypi /var/log $ cat /sys/class/thermal/thermal_zone0/temp
46540
pi@raspberrypi /var/log $


これを 1/1000 してあげれば良い。


最初に思いつくのは bc コマンドでの処理。
echo "scale=3; `cat /sys/class/thermal/thermal_zone0/temp`/1000" | bc


実際に打ってみたんだけど、どうやら bc コマンドが無い。

$ sudo apt-get install bc
$ echo "scale=3; `cat /sys/class/thermal/thermal_zone0/temp`/1000" | /usr/bin/bc
48.154


うん、きちんと計算できる。

OS からの情報 (bash 数値演算機能での処理)

次に bash の数値演算機能。

pThermal=$(cat /sys/class/thermal/thermal_zone0/temp)
echo $((pThermal/1000))
48

…う〜ん、どうやら整数しか処理できない。
数値演算という機能を考えると、当たり前ではあるので仕方ないけど。

専用コマンド

あとは、よく知らないコマンドかな。
vcgencmd measure_temp


実際に打ってみた。

pi@raspberrypi ~ $ vcgencmd measure_temp
temp=47.1'C


これを使うなら sed とかで数値部分を取り出さなきゃダメかな?

シェルスクリプト作成

とりあえず bc コマンドで計算させる方法を採用。
自分で作ったテンプレートを改造する。

$ cd ~/script
$ cp template.sh ckthermal.sh
$ vi ckthermal.sh
〜〜 いろいろ記述 〜
$ diff sample.sh ckthermal.sh
2c2
< ################################################ Modify: 2015/03/29 ##
---
> ################################################ Modify: YYYY/MM/DD ##
4c4
< ## Script name : ckthermal.sh
---
> ## Script name : xxxxx.sh
12,16d11
< # Thermal info
< pThermal=`cat /sys/class/thermal/thermal_zone0/temp`
< pThermalLogDir=/var/log/thermal
< pThermalLogFile=${pThermalLogDir}/thermal.log
<
44,47d38
< # thermal info
< [ -d ${pThermalLogDir} ] || fnEnd 15 ${pThermalLogDir}
< [ -w ${pThermalLogfile} ] || fnEnd 12
<
49,50d39
< pTempData=`echo "scale=3; ${pThermal}/1000" | /usr/bin/bc`
< echo "`date '+%Y/%m/%d %H:%M:%S'`	${pTempData}" >> ${pThermalLogFile}

ソース

で、全文掲載。

#!/bin/sh
################################################ Modify: 2015/03/29 ##
##
## Script name : ckthermal.sh
## Usage       :
## Purpose     :
##
######################################################################

### Parameter setting ################################################

# Thermal info
pThermal=`cat /sys/class/thermal/thermal_zone0/temp`
pThermalLogDir=/var/log/thermal
pThermalLogFile=${pThermalLogDir}/thermal.log

# Log file
pLogDir=/var/log/shellscript
pLogFile=${pLogDir}/`basename $0 .sh`.log

### Function setting #################################################

fnMsg() {
	[ -d ${pLogDir} ] || exit 1
	echo "`date '+%Y/%m/%d %H:%M:%S'` $*" >> ${pLogFile}
}

fnEnd() {
	case $1 in
		0 | "" ) fnMsg "Info) Normal end.";;
		10 ) fnMsg "Error) File not exist.";;
		11 ) fnMsg "Error) Permission read not exist.";;
		12 ) fnMsg "Error) Permission write not exist.";;
		13 ) fnMsg "Error) Permission exec not exist.";;
		15 ) fnMsg "Error) Directory not exist. (${2})";;
		* ) fnMsg "unknown error.";;
	esac
	fnMsg "##### ${0##*/} End. #############"
}

### Main process #####################################################
fnMsg "##### ${0##*/} Started. #############"

# thermal info
[ -d ${pThermalLogDir} ] || fnEnd 15 ${pThermalLogDir}
[ -w ${pThermalLogfile} ] || fnEnd 12


pTempData=`echo "scale=3; ${pThermal}/1000" | /usr/bin/bc`
echo "`date '+%Y/%m/%d %H:%M:%S'`	${pTempData}" >> ${pThermalLogFile}

### End process ######################################################
fnEnd 0

テスト

pi@raspberrypi ~/script $ sh ckthermal.sh
pi@raspberrypi ~/script $ echo $?
0
pi@raspberrypi ~/script $
pi@raspberrypi ~/script $ cat /var/log/thermal/thermal.log
2015/03/29 16:06:23 46.540
pi@raspberrypi ~/script $ cat /var/log/shellscript/ckthermal.log
2015/03/29 16:06:23 ##### ckthermal.sh Started. #############
2015/03/29 16:06:23 Info) Normal end.
2015/03/29 16:06:23 ##### ckthermal.sh End. #############
pi@raspberrypi ~/script $


これを cron で回す。

pi@raspberrypi ~/script $ export EDITOR=vi
pi@raspberrypi ~/script $ crontab -e
* * * * * /bin/sh /home/pi/script/ckthermal.sh
pi@raspberrypi ~/script $ crontab -l
# m h  dom mon dow   command
* * * * * /bin/sh /home/pi/script/ckthermal.sh
pi@raspberrypi ~/script $ 


これで、1分に1回、CPUの温度情報を取得してくれる。
Raspberry Pi の cron 情報は /var/log/syslog に出力されるので、これを見てみると、きちんと認識されてた。

pi@raspberrypi /var/log $ tail /var/log/syslog
Mar 29 16:10:07 raspberrypi crontab[8878]: (pi) END EDIT (pi)
Mar 29 16:10:12 raspberrypi crontab[8881]: (pi) LIST (pi)
Mar 29 16:11:01 raspberrypi /USR/SBIN/CRON[8883]: (pi) CMD (/bin/sh /home/pi/script/ckthermal.sh)
Mar 29 16:12:01 raspberrypi /USR/SBIN/CRON[8904]: (pi) CMD (/bin/sh /home/pi/script/ckthermal.sh)
Mar 29 16:13:01 raspberrypi /USR/SBIN/CRON[8922]: (pi) CMD (/bin/sh /home/pi/script/ckthermal.sh)
Mar 29 16:14:01 raspberrypi /USR/SBIN/CRON[8934]: (pi) CMD (/bin/sh /home/pi/script/ckthermal.sh)
Mar 29 16:15:01 raspberrypi /USR/SBIN/CRON[8946]: (pi) CMD (/bin/sh /home/pi/script/ckthermal.sh)
Mar 29 16:16:01 raspberrypi /USR/SBIN/CRON[8962]: (pi) CMD (/bin/sh /home/pi/script/ckthermal.sh)
Mar 29 16:17:01 raspberrypi /USR/SBIN/CRON[8990]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Mar 29 16:17:01 raspberrypi /USR/SBIN/CRON[8992]: (pi) CMD (/bin/sh /home/pi/script/ckthermal.sh)
pi@raspberrypi /var/log $


では、温度情報は…

pi@raspberrypi /var/log $ cat /var/log/thermal/thermal.log
2015/03/29 16:06:23	46.540
2015/03/29 16:11:01	46.540
2015/03/29 16:12:01	46.002
2015/03/29 16:13:01	46.540
2015/03/29 16:14:01	46.540
2015/03/29 16:15:01	46.540
2015/03/29 16:16:01	46.540
2015/03/29 16:17:01	47.078
pi@raspberrypi /var/log $

よしよし。
とりあえず2〜3日動かして、様子見。


その時は、Excel にでも読み込ませて、グラフにすれば良いかな。


〜〜 2015.4.9 追記 〜〜
しばらくすると、どうも上記のプロセスがきちんと終了しきれてないような挙動を示していて、入力を受け付けなくなった。

sudo vi /var/spool/cron/crontabs/pi
* * * * * /home/pi/script/ckthermal.sh


登録内容を上記に修正。
また様子見。
(ちなみに crontab -e を使わないのは、crontab -r というミス入力対策)