常時稼働のRaspberry PiのLAN(有線/無線)が切断状態となり再起動しないかぎり永久に復旧しないことが稀にあったりする。
再起動したくても設置場所が遠方となると大変なのでcronなどで定期的に再起動するのが安心確実なのだが早急に復旧させたい場合もある。
設定をミスッてるだけのことかもしれないが以前はRaspberry PiのWatchdog機能が使えたような気がするがいつのまにか機能しなくなってるようなのでLANを死活監視して再起動するスクリプトを書いてみた。
LANの保守や故障時に頻繁に再起動されても精神的に宜しくないので3分間隔でpingを実行し5回連続で失敗したら再起動を行うようにしてみた。pingのターゲットはLANのルーターを指定するのがベストかな。
【自動実行する方法】
/opt/lanmonなど適当なディレクトリにlanmon.shとinstall.shを作成後下記コマンドを実行する。
sudo chmod +x ./lanmon.sh
sudo chmod +x ./install.sh
sudo ./install.sh
【journalctlで状況を確認する方法】
journalctl –no-pager -g ” ping failed”
※Bootログも表示されるので想定外の再起動も確認できたりする。
【systemctlで状況を確認する方法】
systemctl status lanmon
※再起動するとステータスもリセットされることに注意。
【LAN死活監視スクリプト(lanmon.sh)】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#!/bin/bash url=192.168.XXX.XXX # router address count=0 while true do ping -c 3 $url >/dev/null 2>&1 if [ $? -ne 0 ]; then count=$((count+1)) echo "$count ping failed. ($url)" if [ count -ge 5 ]; then echo "reboot" sudo reboot fi else count=0 fi sleep 180 done |
【systemdに登録するためのスクリプト(install.sh)】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#!/bin/bash INSTALL_DIR=$(cd $(dirname $0) && pwd) PROGRAM_NAME=lanmon PROGRAM_PATH=${INSTALL_DIR}/${PROGRAM_NAME}.sh PROGRAM_OPTS=">/dev/null 2>&1" SERVICE_NAME=${PROGRAM_NAME} SERVICE_PATH=/etc/systemd/system/${SERVICE_NAME}.service if [ -f ${SERVICE_PATH} ]; then systemctl stop ${SERVICE_NAME} systemctl disable ${SERVICE_NAME} fi echo "[Unit]" >${SERVICE_PATH} echo "Description = LAN Alive Monitor" >>${SERVICE_PATH} echo "After=multi-user.target" >>${SERVICE_PATH} echo "ConditionPathExists=${INSTALL_DIR}" >>${SERVICE_PATH} echo >>${SERVICE_PATH} echo "[Service]" >>${SERVICE_PATH} echo "ExecStart=${PROGRAM_PATH}" >>${SERVICE_PATH} echo "Restart=always" >>${SERVICE_PATH} echo "Type=simple" >>${SERVICE_PATH} echo >>${SERVICE_PATH} echo "[Install]" >>${SERVICE_PATH} echo "WantedBy=multi-user.target" >>${SERVICE_PATH} systemctl daemon-reload systemctl enable ${SERVICE_NAME} systemctl start ${SERVICE_NAME} |