最近、自宅のネットがたまに不調になる。
具体的には、
・リモート会議が切れる
・スマホでトレードしていると「通信できませんでした」が出まくる(トレードできない)
自宅の端末から8.8.8.8にpingを打ってみると、特に問題はなさそうだけど、事象が起きる。
これは、常時見てみたいなと思い、眠っているラズパイを使って見える化してみた。
RRDTOOLを使うんだけど、細かい設定はAIの協力を得て実施
以下、AIからの回答を編集・・・w
1.rrdtoolのインストール
sudo apt update
sudo apt install rrdtool -y
2.Nginxのインストール
sudo apt install nginx -y
3.収集スクリプト (`/home/pi/ping_collect.sh`) の作成
---ここから---
#!/bin/bash
# 監視対象のホスト
HOST="8.8.8.8"
# RRDデータベースのパス
RRD_FILE="/home/pi/ping_data.rrd"
# pingを10回実行し、結果全体を変数に格納
PING_OUTPUT=$(ping -c 10 -W 1 $HOST)
# PINGが成功したかを確認('rtt min/avg/max'の行があるか)
if echo "$PING_OUTPUT" | grep -q 'rtt min/avg/max'; then
# rttの行から min/avg/max の値を抽出
RTT_STATS=$(echo "$PING_OUTPUT" | grep 'rtt min/avg/max' | awk -F'= ' '{print $2}' | awk -F'/' '{print $1, $2, $3}')
# 抽出した値をそれぞれ変数に格納
MIN_TIME=$(echo $RTT_STATS | awk '{print $1}')
AVG_TIME=$(echo $RTT_STATS | awk '{print $2}')
MAX_TIME=$(echo $RTT_STATS | awk '{print $3}')
# RRDに渡す値を設定 (コロン区切りで3つの値を渡す)
RRD_VALUE="${MIN_TIME}:${AVG_TIME}:${MAX_TIME}"
else
# 応答が得られなかった場合は全て "U" (Unknown) として記録
RRD_VALUE="U:U:U"
fi
# RRDデータベースにデータを記録 (DS名:min_time:avg_time:max_time の順)
/usr/bin/rrdtool update $RRD_FILE N:$RRD_VALUE
---ここまで---
4.RRDデータベースの作成
3つのデータソース(`min_time`, `avg_time`, `max_time`)を持つように作成コマンドを変更します。
/usr/bin/rrdtool create /home/pi/ping_data.rrd \
--step 300 \
DS:min_time:GAUGE:600:0:U \
DS:avg_time:GAUGE:600:0:U \
DS:max_time:GAUGE:600:0:U \
RRA:AVERAGE:0.5:1:8640 \
RRA:AVERAGE:0.5:6:8784 \
RRA:MAX:0.5:288:365
5.グラフ生成スクリプト (`/home/pi/ping_graph.sh`) の作成
---ここから---
#!/bin/bash
RRD_FILE="/home/pi/ping_data.rrd"
GRAPH_FILE="/var/www/html/ping_graph.png"
/usr/bin/rrdtool graph $GRAPH_FILE \
--start -86400 \
--vertical-label "Ping Time (ms)" \
--width 600 \
--height 200 \
--title "Ping Response Time (MIN/AVG/MAX over 10 pings)" \
DEF:minval=$RRD_FILE:min_time:AVERAGE \
DEF:avgval=$RRD_FILE:avg_time:AVERAGE \
DEF:maxval=$RRD_FILE:max_time:AVERAGE \
LINE1:avgval#0000FF:"Average Time (AVG)" \
LINE1:maxval#FF0000:"Maximum Time (MAX)" \
LINE1:minval#00FF00:"Minimum Time (MIN)" \
GPRINT:maxval:MAX:"Maximum\:%8.2lf" \
GPRINT:avgval:AVERAGE:"Average\:%8.2lf" \
GPRINT:minval:MIN:"Minimum\:%8.2lf\n"
--ここまで---
6.クリプト実行権限の確認
2つのスクリプトに実行権限があるか再確認します。
ls -l /home/pi/ping_collect.sh
ls -l /home/pi/ping_graph.sh
出力結果の先頭が`-rwxr-xr-x`のように`x`(実行権限)になっていればOKです。
もしなっていない場合は、以下のコマンドで実行権限を付与。
chmod +x /home/pi/ping_collect.sh
chmod +x /home/pi/ping_graph.sh
7.cron設定の確認
crontab -e
以下の2行を追加
*/5 * * * * /home/pi/ping_collect.sh
*/5 * * * * /home/pi/ping_graph.sh
8.Nginx公開ディレクトリの権限問題の解消
Webサーバー(Nginx)の公開ディレクトリに、スクリプトを実行しているユーザー(`pi`)が書き込む権限がないため、
グラフが更新されていない可能性があります。
8-1.`www-data`グループへのユーザー追加
Raspberry Piのデフォルトユーザー(`pi`)を、Webサーバーの所有グループ(`www-data`)に追加します。
sudo usermod -a -G www-data pi
(この変更を反映させるには、一度ログアウトして再ログインするか、`sudo reboot`で再起動が必要です。)
8-2.Web公開ディレクトリのグループ権限変更
`/var/www/html`ディレクトリの所有グループを`www-data`にし、グループの書き込み権限を有効にします。
# 所有グループを www-data に変更
sudo chgrp -R www-data /var/www/html
# グループに書き込み権限を付与
sudo chmod -R g+w /var/www/html
9.index.htmlを作成
/var/www/html/index.html`を作成
---ここから---
<!DOCTYPE html>
<html>
<head>
<title>Ping Response Time Graph</title>
</head>
<body>
<h1>インターネット Ping 応答時間(8.8.8.8)</h1>
<img src="ping_graph.png" alt="Ping Response Time Graph">
<p>最終更新: グラフ更新時間に合わせて自動更新</p>
</body>
</html>
---ここまで---
生成されるグラフは、
AIを使うと、これまでやりづらかったものが簡単に設定できるのはすごい。
ただ、中身をあまり理解しないでいると、生成したものが正しいのかをチェックできないのは問題かもしれない。まあ、そういうときも設定の内容をAIに聞いて納得できればOKだろうか。
