【Raspberry Pi監視】監視プログラムを作成する

Linux
この記事は約12分で読めます。
  1. 【Raspberry Pi監視】Raspberry PiでGmailを送信できるようにする
  2. 【Raspberry Pi監視】監視プログラムを作成する(この記事)
  3. 【Raspberry Pi監視】cronを設定する

前回の記事で、Raspberry PiからGmailを使ってメールを送信できるようになりました。

続いてメールの本文となる監視内容を作成するプログラムを作成していきます。

関連記事:linuxでテキスト編集(1)

                 

RasPi Checkアプリの項目を見てみよう

RasPi Checkでは次の項目が確認できます。

項目名 内容 今回の監視対象
OVER CLOCKING Raspberry Piに関する項目(CPU温度/周波数など)
SYSTEM 稼働時間/メモリー/ディストリビューションなど
NETWORK ネットワークインターフェース情報 ×
DISK USAGE ディスク使用状況
PROCESSES プロセス情報 ×

NETWORKとPROCESSESに関する情報は今回はスルーします。

続いて各項目の情報を取得、成形していこうと思います。

OVER CLOCKING

OVER CLOCKINGでは、CPUの温度、周波数、電圧、ファームウェアバージョンを表示しています。

Raspberry Piではvcgencmdというコマンドでこれらの情報を取得することができます。

vcgencmdの使い方、オプションは以下のページに記載されています。
https://www.raspberrypi.org/documentation/raspbian/applications/vcgencmd.md

基本的な使い方は次の通り。

vcgencmd [コマンド] [オプション]

# 使用例
$ vcgencmd measure_clock arm
frequency(45)=700000000

 

取得したい情報をヒアドキュメントでリスト化し、whileコマンドで連続実行するようにしました。

tmp=/tmp/$$$(basename $0)

# vcgencmdで取得するパラメータリスト
cat << FIN > $tmp-param
measure_temp
measure_clock arm
measure_clock core
measure_volts
version
FIN

# OVERCLOCKING用ステータス取得
cat $tmp-param       |\
while read param     ;
do vcgencmd ${param} ;
done                 > $tmp-vcgen

$tmp-vcgenをcatした結果↓

temp=44.9'C
frequency(45)=900000000
frequency(1)=250000000
volt=1.2500V
Sep 20 2019 18:22:03
Copyright (c) 2012 Broadcom
version 6aa4372223e8c728f255f5e4489f6cde1e364ada (clean) (release) (start)

続いて、取得した情報をawkを使って、RasPi Checkっぽい表記に整形していきます。

## OVERCLOCKING項目
awk 'NR==1{print "CORE Temperature:",substr($1,6,6)}' $tmp-vcgen               > $tmp-ov
awk 'NR==2{print "ARM Frequency:",substr($1,15,9)/1000000" MHz"}' $tmp-vcgen  >> $tmp-ov
awk 'NR==3{print "CORE Frequency:",substr($1,14,9)/1000000" MHz"}' $tmp-vcgen >> $tmp-ov
awk 'NR==4{print "CORE Volt:",substr($1,6,6)*1" V"}' $tmp-vcgen               >> $tmp-ov
awk 'NR==7{print "Firemware:",$2$3$4$5}' $tmp-vcgen                           >> $tmp-ov

$tmp-ovをcatした結果↓

CORE Temperature: 44.9'C
ARM Frequency: 900 MHz
CORE Frequency: 250 MHz
CORE Volt: 1.25 V
Firemware: 6aa4372223e8c728f255f5e4489f6cde1e364ada(clean)(release)(start)

それっぽくなりました。

OVER CLOCKING項目の完成です。

                 

SYSTEM

続いてSYSTEMの項目を作成します。

SYSTEM項目はそれぞれ以下のコマンドで取得できます。

項目名 取得コマンド
Startup uptime
Average load uptime
Main memory free -h
Swap memory free -h
Distribution cat /etc/issue
Serial No cat /proc/cpuinfo
Last refresh uptime -s

OVER CLOCKING項目で使用したvcgencmdのようなコマンドは使用せず、linuxの標準コマンドのみで取得できる情報でした。

以下のようにして情報を取得、整形しました。

## SYSTEM項目
awk '{print NF}' $tmp-upt > $tmp-check

if
[ $(cat $tmp-check) -eq 11 ] ; then
awk '{printf "%s\n%s\n", "Startup:"$3*1" 分前","Average load:"$10*100"%"}' $tmp-upt > $tmp-sy
elif
[ $(cat $tmp-check) -eq 10 ] ; then
awk '{printf "%s\n%s\n", "Startup:"$3*1" 時間前","Average load:"$9*100"%"}' $tmp-upt > $tmp-sy
elif
[ $(cat $tmp-check) -eq 12 ] ; then
awk '{printf "%s\n%s\n","Startup:"$3*1" 日前","Average load:"$11*100"%"}' $tmp-upt > $tmp-sy
elif
[ $(cat $tmp-check) -eq 13 ]; then
awk '{printf "%s\n%s\n","Startup:"$3*1" 日前","Average load:"$12*100"%"}' $tmp-upt > $tmp-sy
fi

cat $tmp-freeh                                                                     |\
awk 'NR==2{printf "%s %s %2d\n","Main memory:",$2-$6"MB/"$2*1"MB",($2-$6)/$2*100}' |\
awk '{print $1,$2,$3"("$4"%)"}'                                                    >> $tmp-sy
cat $tmp-freeh                                                                     |\
awk 'NR==3{printf "%s %s %.f\n","Swap memory:",$3*1"MB/"$2*1"MB",$3/$2*100}'       |\
awk '{if($4>100){print $1,$2,substr($3,0,3)/1000"MB/"substr($3,8,2)"MB",$4/1000}else{print $0}}'|\
awk '{print $1,$2,$3"("$4"%)"}'                                                    >> $tmp-sy
awk '{print "Distribution:"$1,$2,$3}' /etc/issue                                   >> $tmp-sy
awk 'NR==13{print "Serial No:"$3}' /proc/cpuinfo                                   >> $tmp-sy
cat $tmp-upts                                                                      |\
sed 's/-/\//g'                                                                     |\
awk '{print "Last refresh:"$0}'                                                    >> $tmp-sy

uptimeの出力結果は、起動から1時間未満/1日未満/1日以上でフィールド数が変化することが分かったので、フィールド数によって条件を分岐できるようif文を使いました。

uptimeの出力結果は、起動から1時間未満/1日未満/1日と1時間未満/1日と1時間以上で、フィールド数が11/10/12/13と変化することが分かったので、if分を使って処理を変えることにしました。

$tmp-syをcatした結果↓

Startup:5 日前
Average load:19%
Main memory: 211MB/432MB(48%)
Swap memory: 1MB/99MB(1%)
Distribution:Raspbian GNU/Linux 9
Serial No:0000000014decab5
Last refresh:2020/09/01 10:22:57

SYSTEM項目の完成です。

 

DISK USAGE

この項目は一番簡単でした。

ディスクの空き容量を確認できるdfコマンドにオプションhを付けて実行した結果を出すだけです。

ただし、localeが日本語になっていると出力結果に日本語が混ざるので、環境変数を設定しました。

df -hの出力結果(日本語表記になってしまう)
$ df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
/dev/root 7.2G 3.5G 3.4G 52% /
devtmpfs 213M 0 213M 0% /dev
tmpfs 217M 0 217M 0% /dev/shm
tmpfs 217M 5.8M 211M 3% /run
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 217M 0 217M 0% /sys/fs/cgroup
/dev/mmcblk0p1 42M 23M 19M 55% /boot

LANG=C df -hの出力結果(英語表記になる)
$ LANG=c df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 7.2G 3.5G 3.4G 52% /
devtmpfs 213M 0 213M 0% /dev
tmpfs 217M 0 217M 0% /dev/shm
tmpfs 217M 5.8M 211M 3% /run
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 217M 0 217M 0% /sys/fs/cgroup
/dev/mmcblk0p1 42M 23M 19M 55% /boot

上記の点に気を付けてプログラムを書きます。

## DISK USAGE項目
LANG=C df -h > $tmp-dfh

 

                 

メール送信

続いて、取得した情報である$tmp-ovと$tmp-syと$tmp-dfhをメール本文に貼り付けて送信します。

## メール送信
content=$(cat <<-FIN > $tmp-mail
Hllo,this mail is Raspberry Pi Check.

//CHECK TIME
`date`

//OVERCLOCKING
$(cat $tmp-ov)

//SYSTEM
$(cat $tmp-sy)

//DISK USAGE
$(cat $tmp-dfh)

//LOG
${home}/LOG/LOG.$(basename $0).$(date +%H%M%S_%H%M%S)


This mail was sent from Rspberry Pi.
Send only

FIN
)

cat $tmp-mail |\
mail -s "Raspi Check Mail_$(date +%Y%m%d%H%M%S)" XXXXXXXXXX@gmail.com

これでメールが送信されます。

受信メール

作成したプログラムを実行すると次のようなメールが届きます。

件名:Raspi Check Mail_20200906215046

本文:
Hllo,this mail is Raspberry Pi Check.

//CHECK TIME
2020年  9月  6日 日曜日 21:50:45 JST

//OVERCLOCKING
CORE Temperature: 43.3'C
ARM Frequency: 900 MHz
CORE Frequency: 250 MHz
CORE Volt: 1.25 V
Firemware: 6aa4372223e8c728f255f5e4489f6cde1e364ada(clean)(release)(start)

//SYSTEM
Startup:5 日前
Average load:8%
Main memory: 211MB/432MB(48%)
Swap memory: 1MB/99MB(1%)
Distribution:Raspbian GNU/Linux 9
Serial No:0000000014decab5
Last refresh:2020/09/01 10:22:57

//DISK USAGE
Filesystem      Size  Used Avail Use% Mounted on
/dev/root       7.2G  3.5G  3.4G  51% /
devtmpfs        213M     0  213M   0% /dev
tmpfs           217M     0  217M   0% /dev/shm
tmpfs           217M  8.5M  208M   4% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           217M     0  217M   0% /sys/fs/cgroup
/dev/mmcblk0p1   42M   23M   19M  55% /boot

//LOG
/home/pi/LOG/LOG.RASPI_CHECK.20200906215046


This mail was sent from Rspberry Pi.
Send only

想定通り動くことが確認できたので、次はcronを設定していきます。

次の工程:【Raspberry Pi監視】cronを設定する


Raspberry Pi はじめてガイド―[Raspberry Pi 4完全対応]




Raspberry Pi 4 4B-64GB(技適マーク入)MicroSDHCカード64G/Raspbianシステムプリインストール/カードリーダ /5.1V/3A Type-C スイッチ付電源/MicroHDMI-to-HDMIケーブルライン/三つヒートシンク/簡単に取り付けケース/日本語取扱説明書/12ヶ月保証




Samsung EVO Plus マイクロSDカード 128GB microSDXC UHS-I U3 100MB/s Full HD & 4K UHD Nintendo Switch 動作確認済 MB-MC128HA/EC 国内正規保証品

コメント

タイトルとURLをコピーしました