Raspberry Pi で NURO光 の通信状況を記録する方法

# 1. はじめに
- 今回は、自宅のネット回線にて毎日2～3時間程度、通信不通（ONU：ALARM
ランプ赤色点灯）となる事象発生しており、プロバイダ電話窓口にていつごろ通信不通になっていたかたずねられたため、プロバイダ電話窓口へ正確な回答を伝えるべく自分自身への備忘録を兼ねて、Raspberry Piで通信状況を記録する方法を、お伝えしたいと思います。

- 参考サイト：[PINGで死活監視するスクリプト](https://qiita.com/nkojima/items/e9a851e40ef8e2af9993)
- 参考サイト：[Ping - Option Command](https://www.infraexpert.com/study/tcpip5.5.html)
- 参考サイト：[Raspberry Pi pingコマンドでパケットの送受信回数を指定したい](https://teratail.com/questions/297741)
- 参考サイト：[Raspberry PiのTimezoneをAsia/Tokyoに変更する](https://inaba.hatenablog.com/entry/2016/12/25/040243)
- 参考サイト：[クーロン(cron)をさわってみるお](https://qiita.com/katsukii/items/d5f90a6e4592d1414f99)
- 参考サイト：[ラズベリーパイ4でcronを動かす](https://qiita.com/gdate/items/bdf6c620404679063211)
- NURO光（公式）：[インターネット接続ができない](https://support.sonynetwork.co.jp/faqsupport/nuro/web/knowledge6982.html#3)

# 2. この記事を読んでできること
- Raspberry Piでシェルスクリプトとcronを用いて通信状況を記録できるようになる。

# 3. 必要なもの
- Raspberry Pi（この記事では Raspberry Pi3 4GB版 を利用しました）
- SDカード（16GiB）
- インターネット環境
- パソコン（Windows11など）
- sshクライアントソフト（[TeraTerm](https://ja.osdn.net/projects/ttssh2/releases/)）

# 4. 通信状況確認シェルの作成
- 以下のコマンドを順次実行し、通信状況確認シェルを完成させます。

```plaintext:コマンドプロンプト
// ホームディレクトリに移動
$ cd

// ping_log.shファイルを新規作成
$ vi ping_log.sh

// 実行権限パーミッションを設定
$ chmod 755 ping_log.sh

// 手動実行（テスト実行）
$ ./ping_log.sh

// 実行結果ログの確認
$ cat ping.log
```

```plaintext:ping_log.sh
#!/bin/bash

# ping監視先の設定（区切り文字：半角スペース）
IP_LIST=(210.139.252.142)

# ログ出力先の設定
LOG_FILE=/home/pi/ping.log

# ping監視先の数だけ繰り返し
for ip in ${IP_LIST[@]}
do
  ping_result=$(ping -c 1 $ip | grep '100% packet loss')
  date_result=$(date)

  if [[ -n ${ping_result} ]]; then
    echo "[WARN] server inactive: $ip $date_result $ping_result" >> $LOG_FILE
  else
    echo "[INFO] server active: $ip $date_result" >> $LOG_FILE
  fi
done
```

- 補足：`IP_LIST`変数は、IPアドレス以外にもホスト名(`www.so-net.ne.jp`)を設定することもできます。ただし、その際は、grepキーワードが`'100% packet loss'`ではなく、`'Temporary failure in name resolution'`になると思います。また、if文も`if [ -n ${ping_result} ]; then`にすべきかもしれません、各自で試行錯誤してみてください。

# 5. crontabの設定
- 毎分、1分間隔で自動的にシェル実行するよう、cron設定をおこないます。
- 以下のコマンドを実行し、crontabを編集します。

```plaintext:コマンドプロンプト
// crontabの編集
$ crontab -e

# crontabの末尾に以下の1行を追記し保存する 
0-59 * * * * /bin/bash /home/pi/ping_log.sh
```

# 6. Timezoneの設定
- ログのタイムスタンプが日本時間で出力されるよう、Timezoneを設定する。
- 以下のコマンドを実行し、Timezoneを設定します。
- 
```plaintext:コマンドプロンプト
// crontabの編集
$ sudo raspi-config
    → 4 Localisation Optionsを選択
        → I2 Change Timezoneを選択
            → Asiaを選択
                → Tokyoを選択
    → Finishを選択

// dateコマンド結果の確認
$ date
```

# 7. 通信状況ログの確認
- tailコマンドにて、通信状況ログを監視確認します。
- tailコマンドによるログ監視の中断は、CTRL+Cキー押下します。

```plaintext:コマンドプロンプト
// ホームディレクトリに移動
$ cd

// 通信状況ログの確認（ログ監視の中断は、CTRL+Cキー押下）
$ tail -f ping.log

[WARN] server inactive: 210.139.252.142 Tue 31 Jan 17:41:11 JST 2023 1 packets transmitted, 0 received, 100% packet loss, time 0ms
[WARN] server inactive: 210.139.252.142 Tue 31 Jan 17:42:11 JST 2023 1 packets transmitted, 0 received, 100% packet loss, time 0ms
[WARN] server inactive: 210.139.252.142 Tue 31 Jan 17:43:11 JST 2023 1 packets transmitted, 0 received, 100% packet loss, time 0ms
[WARN] server inactive: 210.139.252.142 Tue 31 Jan 17:44:12 JST 2023 1 packets transmitted, 0 received, 100% packet loss, time 0ms
[INFO] server active: 210.139.252.142 Tue 31 Jan 17:45:01 JST 2023
[INFO] server active: 210.139.252.142 Tue 31 Jan 17:46:01 JST 2023
[INFO] server active: 210.139.252.142 Tue 31 Jan 17:47:01 JST 2023
[INFO] server active: 210.139.252.142 Tue 31 Jan 17:48:01 JST 2023

```

# 8. おわりに
いかがでしたでしょうか？意外と簡単に通信状況を記録＆確認することができたのではないかなと思います。
今回の記事が、みなさまの通信状況改善になれば幸いです。

2023/01/30 TAKAHIRO NISHIZONO