0
Help us understand the problem. What are the problem?

posted at

updated at

Organization

ラズパイのプロセス監視を slee-Pi3 のウォッチドッグタイマで【正常動作検知による監視編】

今回は slee-Pi3 のウォッチドッグタイマを利用したプロセス監視を行います。
※作業環境と事前準備は こちら をご覧ください。

[関連ブログ]

slee-Pi3のウォッチドッグタイマを利用したプロセス監視
OOM 状態からの即時復帰
【正常動作検知による監視】← 本ブログ
異常動作検知による監視
異常動作検知-実装編

[目的と方法]

目的:停止したくないプログラムを実装したい
方法:slee-Pi3 のウォッチドッグタイマがハートビート信号を監視する仕組みを利用
プログラム内にハートビートを組込む
※slee-Pi3 の 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 を入れています。

/opt/mtx/test-heartbeat.sh
#!/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-Pi3 の LED1 が点滅しているか
③ ウォッチドッグタイマによる再起動が行われないか
 ※slee-Pi3 セットアップ時のウォッチドッグタイマ監視時間は60秒です。

[まとめ]

今回は slee-Pi3 のウォッチドッグタイマによるプロセス監視機能を利用しました。
停止させたくないプログラムにハートビートを組込むだけで簡単に実装できます。
さらに処理の途中経過を保存できれば再起動した場合も復帰が容易です。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
0
Help us understand the problem. What are the problem?