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 の動作確認が狙いなので、お手元の環境で実行する際は service ファイルのオプションを調整してください。
※作業環境と事前準備は こちら をご覧ください。
[関連ブログ]
slee-Pi 3 のウォッチドッグタイマを利用したプロセス監視
【OOM 状態からの即時復帰】
【正常動作検知による監視】
【異常動作検知による監視】← 本ブログ
【異常動作検知-実装編】
[目的と方法]
目的:停止したくないプログラムが停止した場合にクリーンな状態で再開させたい。
方法:プログラム内にハートビートを組込んでおき、ウォッチドッグタイマが異常検知した際に再起動させる。
[手順1]サービスファイル作成
test-heartbeat.service を作成します。
今回は、再現性を高める+プロセスがkillされやすいように Nice=19 , OOMScoreAdjust=1000 に設定しています。
[Unit]
Description=sleepi3 test heartbeat
DefaultDependecies=no
After=sysinit.target
[Service]
Type=simple
Nice=19
OOMScoreAdjust=1000
ExecStart=/opt/mtx/test-heartbeat.sh
[Install]
WantedBy=sysinit.target
※ 設定の詳細は以下をご覧ください。
Nice
OOMScoreAdjust
[手順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] OOM Killer 発生用プログラムの作成
こちら のブログを参考に oom.c を作成します。
※ コード中に (&t) のような HTML エンティティが含まれています。コードを使用する際は該当部分を取り除いてご利用ください。
[手順5]復帰確認
先ほど作成した oom.c をコンパイル後、実行します。
OOM が発生すると、ハートビート信号が途絶え、60秒で slee-Pi 3 が強制再起動を実施します。
再起動後、ハートビートが正常に再開すれば、異常状態からの復旧が完了したと判断します。
再起動後、下記コマンドで再起動要因を確認してください。watchdog であれば正しくハードウェアリセットできています。
sleepi3ctl get wakeup-flag
watchdog
[まとめ]
今回は slee-Pi 3 のウォッチドッグタイマによるプロセス監視機能を利用しました。
監視させているプロセスが OOMKiller に kill された際にハードウェアリセットをかける仕組みです。
[補足]ハードウェアリセットがうまく機能しない場合
カーネルの OOMK やスワップメモリにより OOM Killer 発生用プログラムが意図しない動作をしている可能性があります。以下のようにスワップメモリを無効化し、OOMK 発生用プログラムが生き残るようにしてください。
スワップメモリ無効化
$ sudo bash -c "echo 1 > /proc/sys/vm/overcommit_memory"
$ cat /proc/sys/vm/overcommit_memory
1
$ sudo swapoff -a
OOMK プログラム生存設定
$ sudo nice -n -20 oom
$ Ctrl + Z で一時的に停止
$ sudo bash -c 'echo -1000 > /proc/$(pidof oom)/oom_score_adj'
$ fg
sudo nice -n -20 oom

