続 CPU 温度を RRDtool でグラフ化
今回は、忘れないうちにスクリプト化したものを、備忘として記載。
RRDtool で rrd ファイルを作成し、そこへデータを追記していくシェルスクリプトと、グラフ化するシェルスクリプトを作成。
やったこと
今回必要になるアプリのインストール。
$ sudo apt-get update && sudo apt-get upgrade $ sudo apt-get install rrdtool sleepenh apache2
ラウンドロビンデータベース (rrd) の作成。
$ sudo rrdtool create /home/pi/rrd/thermaldata.rrd \ --start $(date +"%s") \ --step 60 \ DS:thermal:GAUGE:600:0:U \ RRA:AVERAGE:0.5:1:7200
今回は、60秒ごとのデータを、7200 ステップ(60分*24時間*5日)ほど収集する。
その rrd ファイルにデータを追記していくスクリプト thermaladd.sh を作成して、crontab で回す。
で、その crontab に追記した内容はコレ。
# 毎分、データ追記 * * * * * /usr/local/bin/thermaladd.sh
関連するディレクトリを作成して…と。
$ su - # mkdir ~pi/rrd # mkdir /var/www/rrd
試しにグラフ化してみると、時折 50℃ を超えていそうな気配がしたので、以前取り付けた CPU ファンを常時回すことに。
そこからしばらく経った現時点では、こんな感じ。
50℃を閾値として見やすくするのに、HRULEをベタ書き。
極端に温度が下がっている部分は、エアダスターの生ガスを吹き付けて強制冷却してたりする(あまりマネはしない方が良いです)。
そこからは、ファンを常時回しているので、それなりに低い温度で安定している模様。
そうそう、定格で 5v 動作のファンを 3.3v で動作させているので、めちゃくちゃ静か。
やっぱりブラウザで表示させると、楽だねぇ
作ったもの
一応、恒常的に使うものは /usr/loca/bin に置いて使っている。
まずは、データを集積するためのスクリプト thermaladd.sh なんだけど、いろいろやろうとして未使用になっている部分は削除。
bc コマンドがあれば実数で、なければ整数でデータ追記。
#!/bin/sh ###################################################################### ## ## Script name : thermaladd.sh ## ###################################################################### ### Parameter set #################################################### pBaseDir=/home/pi/rrd pGraphData="${pBaseDir}/thermaldata.rrd" type bc > /dev/null 2>&1 if [ "${?}" = "0" ]; then pTemp=$(echo "scale=3; $(cat /sys/class/thermal/thermal_zone0/temp) / 1000" | bc) else pTemp=$(( $(cat /sys/class/thermal/thermal_zone0/temp) / 1000 )) fi ### Function set ##################################################### logput() { logger -t "${0##*/}" "$*" } fnEnd() { case $1 in 0 | "" ) logput "Normal end";; * ) logput "error, unknown.";; esac logput "### script end (return=${1}) ###" exit ${1} } ### Main process ##################################################### logput "### script start ###" logput "## make graph data (rrd)" logput "update ${pGraphData} --template thermal $(date +%s):${pTemp}" rrdtool update "${pGraphData}" \ --template thermal \ $(date +"%s"):${pTemp} [ "$?" = "0" ] || fnEnd $? ### End process ###################################################### fnEnd 0
集積したデータをグラフ化するためだけの graphrefresh.sh
引数に適当な名前を指定してあげると、その引数.png というファイルが出来る。
引数がなければ、thermal.png というのがデフォルトの名前になっている。
#!/bin/sh ###################################################################### ## ## script name : graphrefresh.sh ## ###################################################################### ### Parameter set #################################################### pUser=root pGraphDir=/var/www/rrd pGraphTitle="$(uname -n) : CPU Thermal Average" pGraph="${pGraphDir}/${1:-thermal}.png" pGraphData="/home/pi/rrd/thermaldata.rrd" pVerticalLabel="${pGraph##*/}" pWidth="600" pUpperLimit="55.0" pLowerLimit="30" ### Function set ##################################################### logput() { logger -t "${0##*/}" "$*" } fnEnd() { case $1 in 0 | "" ) logput "Normal end";; 10 ) logput "error, check to ${2}";; 11 ) logput "error, read permission, not exsit.";; 12 ) logput "error, write permission, not exsit.";; 13 ) logput "error, executive permission, not exsit.";; 14 ) logput "error, executive user ${pUser} only.";; * ) logput "error, unknown.";; esac logput "### script end (return=${1}) ###" exit ${1} } ### Main process ##################################################### logput "### script start ###" logput "## environment check" [ -r "${pGraphData}" ] || fnEnd 11 [ "$(whoami)" = "${pUser}" ] || fnEnd 14 logput "## graph making" rrdtool graph "${pGraph}" \ --title "${pGraphTitle}" \ --vertical-label "${pVerticalLabel}" \ --width ${pWidth} \ --upper-limit ${pUpperLimit} \ --lower-limit ${pLowerLimit} \ --rigid \ --imgformat PNG \ --start end-5d \ --end now \ HRULE:50#FF0000:"seperater":dashes=4 \ DEF:thermal=${pGraphData}:thermal:AVERAGE \ LINE1:thermal#00FF00:"CPU thermal" \ GPRINT:thermal:LAST:"cur\: %2.2lf /" \ GPRINT:thermal:AVERAGE:"ave\: %2.2lf /" \ GPRINT:thermal:MAX:"max\: %2.2lf /" \ GPRINT:thermal:MIN:"min\: %2.2lf" [ "$?" = "0" ] || fnEnd 10 "rrdtool graph" # index.html create /usr/local/bin/rrdindex.sh ### End process ###################################################### fnEnd 0 ### History ########################################################## Ver 0.1 - 2015/5/4
でもって、グラフ化したファイルを HTML で表示させるための rrdindex.sh
#!/bin/sh ###################################################################### ## ## script name : rrdindex.sh ## ###################################################################### ### Parameter setting ################################################ pIndexDir=/var/www/rrd pHTML=${pIndexDir}/index.html ### Function setting ################################################# ### Main process ##################################################### echo "<html>" > ${pHTML} echo " <head>" >> ${pHTML} echo " <title>rrd graph</title>" >> ${pHTML} echo " </head>" >> ${pHTML} echo " <body>" >> ${pHTML} for pPng in $(ls ${pIndexDir}/*.png); do printf " <div><img src=\"./${pPng##*/}\"></div>\n" >> ${pHTML} done echo " </body>" >> ${pHTML} echo "</html>" >> ${pHTML} ### End process ######################################################
いずれもヤッツケ感が半端ないw
〜〜 5/9 追記 〜〜
とりあえず、5日間経過したのでグラフを更新。
比較のため、上記と同じものを貼り付け。
気温が分からないと、比較しようがない気がしてきた。
それでも45℃を超えた様子がなく、ファンが仕事をしている様子はよくわかるので嬉しい。