MECHATRAXのブログ
弊社製品やサービスに関するブログです。企画や開発の際の参考になれば幸いです。
slee-Pi 3のWatchdog timerでラズパイのプロセス監視【正常動作の検知】
slee-Pi 3のWatchdog timerでラズパイのプロセス監視【正常動作の検知】
【2025年10月追記】
本ブログは、2025年10月に下記環境にて動作確認済みです。
sleepi3-bookworm-lite-arm64-20250520.md
今回は slee-Pi 3 のウォッチドッグタイマを利用したプロセス監視を行います。
※作業環境と事前準備は こちら をご覧ください。
[関連ブログ]
slee-Pi 3のウォッチドッグタイマを利用したプロセス監視
【OOM 状態からの即時復帰】
【正常動作検知による監視】← 本ブログ
【異常動作検知による監視】
【異常動作検知-実装編】
[目的と方法]
目的:停止したくないプログラムを実装したい
方法:slee-Pi 3 のウォッチドッグタイマがハートビート信号を監視する仕組みを利用
プログラム内にハートビートを組込む
※slee-Pi 3 の LED1 を点滅させるとウォッチドッグタイマがハートビートとして認識します。
詳細は sleepi3-heartbeat.service , heartbeat.py をご覧ください。
[手順1]サービスファイル作成
test-heartbeat.service を /etc/systemd/system/ 以下に作成します。
[Unit]
Description=sleepi3 test heartbeat
DefaultDependencies=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 を停止し、自作ハートビートを起動する
sudo systemctl stop sleepi3-heartbeat.service
sudo systemctl disable sleepi3-heartbeat.service
sudo systemctl enable test-heartbeat.service
sudo systemctl restart test-heartbeat.service
※ sleepi3-heartbeat.service は sleepi3-utils に含まれているサービスです。
[手順4]ラズベリーパイを再起動して、自作ハートビートの状態を確認
以下の項目に異常がなければウォッチドッグタイマの正常動作検知によるプロセス監視が実現できています。
・ 以下コマンドでサービスが active かどうか
systemctl status test-heartbeat.service
・ slee-Pi 3 の LED1 が点滅しているか
・ ウォッチドッグタイマによる再起動が行われないか
設定に不備がある場合、起動後60秒で slee-Pi 3 による強制再起動が実行されます。
[まとめ]
今回は slee-Pi 3 のウォッチドッグタイマによるプロセス監視機能を利用しました。
停止させたくないプログラムにハートビートを組込むだけで簡単に実装できます。
さらに処理の途中経過を保存できれば再起動した場合も復帰が容易です。

