ラズパイの温度をcronで定期的に記録する

raspberrypi3の発熱に関してはいろいろ記事が出ています。たしかにCPUとか触ってみるとかなり熱い。CPUの温度を得るコマンドはこの記事でわかりました。
[code]
vcgencmd measure_temp #=> temp=52.6’C
[/code]

毎回このコマンドを打つのは面倒なのでcronで定期的にチェックしてログファイルに残すことにしました。

先に挙げたコマンドを打つだけでは時刻がわからないのでdate関数で時刻を得ます。
[code lang=”bash”]
date +"%m/%d" #=> 05/23
date +"%H:%M" #=> 06:12
[/code]

3つのコマンドを使えば
05/23 06:12 temp=52.6’C
のような文字列を得られるのでログファイルにリダイレクトしていけばいいでしょう。

これでシェルスクリプトを書きます。
temp_recorder.sh
[code lang=”bash”]
#!/bin/bash

date=(`date +"%m/%d"`)
time=(`date +"%H:%M"`)
temp=(`vcgencmd measure_temp`)
str=$date" "$time" "$temp
echo $str >> temp_log

[/code]

それぞれ変数に入れて、空白をいれて連結しているだけなのでとても簡単なスクリプトです。このスクリプトに実行権限を与えます。

[code lang=”bash”]
chmod 744 temp_recorder.sh
./temp_recorder.sh
cat temp_log #=> 05/23 06:12 temp=52.6’C
[/code]

うまく行きました。あとはこれをcronで自動的に実行してもらうだけです。

[code lang=”bash”]
crontab -e
[/code]
で編集できるのですが、時刻の指定方法が最初はわかりにくいです。(crontabを実行すると最初にどのエディターで編集するか聞かれたら好きなものに対応した番号を選びましょう。)
曜日指定とか毎日定時に実行とか細かく指定できるので検索してみてください。わたしはとりあえずうまく動くか確認するため2分おきに記録するようにしました。

[code lang=”bash”]
# Edit this file to introduce tasks to be run by cron.
#~~~~~省略~~~~~
# m h dom mon dow command
*/2 * * * * ./temp_recorder.sh

[/code]
こんな感じで末尾に追加します。最後は改行しましょう。念の為
[code lang=”bash”]
sudo /etc/init.d/cron restart
[/code]
でcronを再起動しておきます。

[code lang=”bash”]
cat temp_log
[/code]
で確認すると動いているようです。
[code gutter=”false”]
05/23 07:22 temp=53.7’C
05/23 07:24 temp=54.2’C
05/23 07:26 temp=53.7’C
05/23 07:28 temp=59.1’C
05/23 07:30 temp=56.4’C
[/code]

毎回やると面倒なことを簡単に自動化出来ました。

:追記
ログだけ取ってそれでおしまいでは意味がないなのでごく簡単なデータ処理だけ。

ラズパイが動いている間ずっとログをとっているのでデータはどんどん溜まります。直近1時間のデータだけ調べましょう。ファイルの最後から30行を取り出せばいいのでテキストの末尾を切り出すコマンドtailを使います。

[code lang=”bash”]
cat temp_log | tail -30
[/code]

|はパイプといって出力を次のコマンドに渡すものと考えればいいです。

[code gutter=”false”]
05/23 15:24 temp=56.9’C
05/23 15:26 temp=56.9’C
05/23 15:28 temp=56.4’C

~~~~~~~~省略~~~~~~~~~

05/23 16:18 temp=66.6’C
05/23 16:20 temp=72.0’C
05/23 16:22 temp=73.1’C

[/code]

この10分ぐらい作業したので最後の方はかなり温度が高くなってます。上から順に見ていけば温度の推移はわかります。では、いつが一番温度が高かったか? これはいちいち見比べるのは面倒なので並び替えます。このログファイルだとスペースで区切られた3つ目、
temp=~~~ のある3列目でソートすればよいです。
テキストファイルのソートは簡単でn列目をキーに並び替えるなら
[code lang=”bash”]
sort -kn file
[/code]
でOKです。

先ほどの表示をパイプで渡して
[code lang=”bash”]
cat temp_log | tail -30 | sort -k3
[/code]

[code gutter=”false”]
05/23 15:56 temp=55.8’C
05/23 16:00 temp=55.8’C
05/23 15:38 temp=56.4’C

~~~~~~~~省略~~~~~~~~~

05/23 16:26 temp=74.1’C
05/23 16:30 temp=74.1’C
05/23 16:10 temp=75.2’C

[/code]

最大値と最小値で20度の差があることがわかりました。

ただし今回は横着をして3列目を文字列としてソートしています。何がまずいかというとCPUの温度が100’Cを超えていたとして
05/23 15:56 temp=102.8’C
こんなデータが取れた時に、単純に文字列としてソートするとこのデータは先頭に来ます。辞書順で小さい方と判断されるわけです。こういうことが無いようにするにはgrepして温度を取り出し、数値としてソートしないといけません。

今回はCPUの温度なんで10度以下にも100度以上にもならんという想定でやりましたが横着していい場合なのか見極めましょうという話です。

ソートコマンドについてはこの記事が詳しかったです。

今回やったこと

#シェルスクリプトを書く
temp_recorder.sh
[code lang=”bash”]
#!/bin/bash

date=(`date +"%m/%d"`)
time=(`date +"%H:%M"`)
temp=(`vcgencmd measure_temp`)
str=$date" "$time" "$temp
echo $str >> temp_log

[/code]

[code lang=”bash”]
#実行権限を与えて手動で実行
chmod 744 temp_recorder.sh
./temp_recorder.sh
cat temp_log

#cronに登録
crontab -e

[/code]

#末尾に追加
*/2 * * * * ./temp_recorder.sh

[code lang=”bash”]
#cronを再起動
sudo /etc/init.d/cron restart

#ログファイルを確認
cat temp_log

#直近1時間のデータを温度順でソート(手抜き版)
cat temp_log | tail -30 | sort -k3
[/code]


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です