MECHATRAXのブログ

弊社製品やサービスに関するブログです。企画や開発の際の参考になれば幸いです。
slee-Pi3のWatchdog timerでラズパイのプロセス監視【正常動作の検知】

slee-Pi3のWatchdog timerでラズパイのプロセス監視【正常動作の検知】

2021.04.06@kiyonaga

今回は 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 を入れています。

/etc/systemd/system/test-heartbeat.service
#!/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 のウォッチドッグタイマによるプロセス監視機能を利用しました。
停止させたくないプログラムにハートビートを組込むだけで簡単に実装できます。
さらに処理の途中経過を保存できれば再起動した場合も復帰が容易です。

< ブログ一覧へ戻る

関連記事はこちら