TL;DR
現在のところ原因ははっきりとはわかっていないが、SSHサーバが落ちるわけではないのに接続できなくなる現象が発生している。そのため、自動的にネットワークを再起動するスクリプトを動かしている。
状況の列挙
- サーバはWifiで動いている。
- 突然接続できなくなり、Pingも通らない。
- Journalctlのログにもエラーらしいエラーはない。
- SSHなどで接続していると突然応答がなくなり、復帰できる場合もあるが、復帰できないこともある
- ルータが落ちることがあるらしく、動かないと思ってルータのコンソールにアクセスすると勝手にルータが再起動する(ただし、ルータが動いていてもだめなケースもある)
- Wifiの強度はそれほど強くないので環境としてはあまりよくない
- RaspberryPiなんかを無線で運用する場合に同様の現象が発生するかもしれない
- ディスクアクセスが増えたときに落ちやすい気がするが、Wifi->Samba on Docker->ZFSとなってるからどこが原因かぱっとはわからない
- SambaじゃなくてNetatalk使ったら安定してるー>Sambaのバグ?
- Wicdでアクセスポイントを見つけたら接続する機能を使えば再接続してくれるかも?→してくれなかった
で、結局?
多分無線の強度が弱くて、接続が不安定なのではないかとみられる。
現在の対処
ルータに対してPingが通らなかったらNetworkingを再起動するようにした。
ただし、UbuntuでNetworkingは再起動できないのにハマった。
これはだめ
sudo systemctl restart networking
で、実際に使ったスクリプトはこんなかんじだった。
network-watchdog.sh
#!/bin/bash
while true
do
ping -A -c 1 192.168.1.1 # ルータのIPにPing
if test $? -eq 1 # 自分の環境ではPingのリターンコードが1のときタイムアウトエラー
then
date >> /var/log/network-watchdog.log # ログは適当
echo "restart network interfaces." >> /var/log/network-watchdog.log
sudo systemctl restart wicd >> /var/log/network-watchdog.log
echo " " >> /var/log/network-watchdog.log
fi
sleep 60s
done
自分の環境ではwicdを再起動すればうまく動いてくれたのでとりあえずそれで運用している。
あとはこれをサービスとして登録する。
参考にしました→Systemdを使ってさくっと自作コマンドをサービス化してみる
/etc/systemd/system/network-watchdog.service
[Unit]
Description = watchdog timer of network connection.
Requires = networking.service
After = networking.service
[Service]
ExecStart = /usr/local/bin/network-watchdog.sh
Restart = always
Type = simple
[Install]
WantedBy = multi-user.target
あとは有効にするだけ
# 自動起動on
$ sudo systemctl enable network-watchdog
# 起動
$ sudo systemctl start network-watchdog