組み込み制御を行うシステムには,なんかあった時のためにWatchdog Timer(ウォッチドッグタイマー)を必ず組み込む。
通常はハードウェアで実装している(ソフトウェアで実装する場合は,そのソフトウェアの問題からは回避できないから)当たり前の機能ではあるが,Raspberry PiのSoCでもWatchdog Timerが利用できるようだ。
何かあった時に自動で再起動するように出来るので有用ではあると思う。確認も兼ねてこの機能を使用するようにしてみた。
/dev/watchdogデバイスを確認する。
# ls -al /dev/watchdog*
見つからない・・・
max-load-1 = 24 <-- コメントを外す。 watchdog-device = /dev/watchdog <-- コメントを外す waatchdog-timeout = 10 <-- 追加
# echo "bcm2835_wdt" >> /etc/modules
# modprobe bcm2835_wdt
# lsmod | grep bcm2835_wdt -- bcm2835_wdt 4133 0 --
options bcm2835_wdt heartbeat=14 nowayout=0
# activating the hardware watchdog dtparam=watchdog=on
/dev/watchdog デバイスファイルが作成されているか確認する。
# ls -al /dev/watchdog* crw------- 1 root root 10, 130 May 19 07:09 /dev/watchdog crw------- 1 root root 253, 0 May 19 07:09 /dev/watchdog0
今度は,デバイスファイルが見つかった。
Watchdog Timerをバックグラウンドでカウントアップしていき,設定された時間に達するとシステムをリセットする。
watchdog resetを行うプログラムを用意する。
これにより定期的にwatchdog timerをリセットしてカウンターを0にする。
システムが正常な場合このプログラムも正常に動作し続けるため,Watchdogシステムによるリセットが行われないようになっている。
今回はバックグラウンドで動いているプログラムによりwatchdog timerをリセットしている。本来は重要なプログラムでwatchdog timerをリセットすべきだと思う。
# apt-get install watchdog
.... [Install] WantedBy=multi-user.target
# systemctl enable watchdog # systemctl start watchdog
#RuntimeWatchdogSec=0
RuntimeWatchdogSec=14
とりあえずWatchdog timerにより再起動(リセット)するかどうか確認してみる。
これには,無理やりシステムを停止するようなコマンドを実行してみる。
Bashの入力プロンプトで,「:(){ :|:& };:」と入力する*1と,
$ :(){ :|:& };:
なぜかシステムを停止することができちゃう
:という関数(引数なし)を定義することを宣言している。
続く{ :|:& };がその本体で,自分自身を2つ起動してパイプでつないで,バックグラウンドで実行することを意味する。バックグラウンドなので親プロセスをkillしても子プロセスは終了しない。
最後の:が,その関数の実行開始を意味している。
この文字列は,関数名を:としていることがわかりにくくしている。もっと判りやすい名前に置換すると次のようになる。
forkbomb(){ forkbomb|forkbomb & } ; forkbomb
同じ機能をCの場合は,
#include <unistd.h> int main() { while(1) fork(); return 0; }
でプログラムできる。
Pythonだと,
import os while True: os.fork()
になるのかな。
新しくコメントをつける