MECHATRAXのブログ
弊社製品やサービスに関するブログです。企画や開発の際の参考になれば幸いです。
slee-Pi3のWatchdog timerでラズパイのプロセス監視【正常動作の検知】
slee-Pi3のWatchdog timerでラズパイのプロセス監視【正常動作の検知】
今回は slee-Pi 3 のウォッチドッグタイマを利用したプロセス監視を行います。
※作業環境と事前準備は こちら をご覧ください。
[関連ブログ]
slee-Pi 3のウォッチドッグタイマを利用したプロセス監視
【OOM 状態からの即時復帰】
【正常動作検知による監視】← 本ブログ
【異常動作検知による監視】
【異常動作検知-実装編】
[目的と方法]
目的:停止したくないプログラムを実装したい
方法:slee-Pi 3 のウォッチドッグタイマがハートビート信号を監視する仕組みを利用
プログラム内にハートビートを組込む
※slee-Pi 3 の LED1 を点滅させるとウォッチドッグタイマがハートビートとして認識します。
詳細は sleepi3-heartbeat.service , heartbeat.py をご覧ください。
[手順1]プログラム起動用の service ファイル作成
作成したサービスファイルは /etc/systemd/system/ 以下に配置します。
/etc/systemd/system/test-heartbeat.service[Unit]
Description=sleepi3 test heartbeat
DefaultDependecies=no
After=sysinit.target
[Service]
Type=simple
ExecStart=/opt/mtx/test-heartbeat.sh ← 実行ファイルのフルパス
[Install]
WantedBy=sysinit.target
[手順2]プログラム+ハートビート作成
素数計算中にハートビートを組込みます。
また、素数と計算中の数値は各々別ファイルに保存して、再起動しても途中から計算を開始します。
点滅が早すぎるとハートビートとして認識されないので、LED 消灯後に sleep を入れています。
#!/bin/bash
#素数保存ファイル
LOG=/tmp/prime-num.log
#LED OFF
echo "0" > /sys/class/leds/sleepi\:led0/brightness
#数値保存ファイルの有無確認と計算が止まった時点の数値代入
if [ -f $LOG ]; then
num=`tail -1 /tmp/save-num.log`
echo "num="$num
else
num=3
fi
#保存ファイルの喪失やエラーのときは最初から
if [ $((num%2)) -eq 0 ]; then
num=3
fi
for((i=num;;i+=2)); do
#計算中の数値保存
echo $i | tee -a /tmp/save-num.log
#LED ON
echo "255" > /sys/class/leds/sleepi\:led0/brightness
k=0
r=`echo "sqrt($i)" | bc`
for((j=3;j<=r;j+=2)); do
l=$((i%j))
if [ $l -eq 0 ]; then
k=1
break
fi
done
if [ $k -eq 0 ]; then
echo -n $i', ' | tee -a /tmp/prime-num.log
fi
#LED OFF
echo "0" > /sys/class/leds/sleepi\:led0/brightness
sleep 1
done
※今回はお試し用なので素数の”2″は既に計算できているものとして考えます。
※素数計算は こちら を参考にしました。
[手順3]既存の sleepi3-heartbeat.service を停止し、自作 service を起動
sleepi3-heartbeat.service は sleepi3-utils に含まれています。
以下コマンドを上から順に実行してください。
test-heartbeat.service の部分は実際に作成したサービスファイル名を入れてください。
sudo systemctl disable sleepi3-heartbeat.service
sudo systemctl enable test-heartbeat.service
sudo systemctl restart test-heartbeat.service
[手順4]ラズベリーパイを再起動して自作 service が正常に動作するか確認
以下の項目に異常がなければウォッチドッグタイマの正常動作検知によるプロセス監視が実現できています。
① 以下コマンドで service が稼働(active)状態どうか
systemctl status test-heartbeat.service
② slee-Pi 3 の LED1 が点滅しているか
③ ウォッチドッグタイマによる再起動が行われないか
※slee-Pi 3 セットアップ時のウォッチドッグタイマ監視時間は60秒です。
[まとめ]
今回は slee-Pi 3 のウォッチドッグタイマによるプロセス監視機能を利用しました。
停止させたくないプログラムにハートビートを組込むだけで簡単に実装できます。
さらに処理の途中経過を保存できれば再起動した場合も復帰が容易です。