一定時間Wifi接続がない場合、自動的に再起動します


13

Raspberry Piサーバーがランダムな時間後にWi-Fi接続を失い、どういうわけか自動的に回復できないようです。

通常、手動で再起動することで問題が解決します。

約30分後にwifiがない場合、自動的に再起動させたいと思います。どうやってやるの?


5
インターフェイスをダウンさせて、再起動しようとしましたか?ワイヤレスカードのカーネルモジュールのアンロードと再ロードはどうですか?再起動せずにカードをリセットするためにできることは他にもあります。
hololeap 14

1
ええ、これもおそらく動作しますが、ここでの主な問題は、これを自動的に検出して適切なアクションを実行する方法です。
クランプ14

回答:


10

これは基本的に、ステップバイステップの指示があれば、ワーウィックの答えです。


  1. ホームフォルダーに次のシェルスクリプトを作成します。

    check_inet.sh

    #!/bin/bash
    
    TMP_FILE=/tmp/inet_up
    
    # Edit this function if you want to do something besides reboot
    no_inet_action() {
        shutdown -r +1 'No internet.'
    }
    
    if ping -c5 google.com; then
        echo 1 > $TMP_FILE
    else
        [[ `cat $TMP_FILE` == 0 ]] && no_inet_action || echo 0 > $TMP_FILE
    fi
    
  2. 実行可能になるようにアクセス許可を変更する

    $ chmod +x check_inet.sh
    
  3. /etc/crontabを使用sudoして編集し、次の行を追加します(yourname実際のユーザー名に置き換えます)。

    */30 * * * * /home/yourname/check_inet.sh
    

5

1つの方法は、30分ごとにスクリプトを実行するエントリをルートのcronに置くことです。スクリプトは、おそらくを使用してWIFI接続をテストし、ping接続が存在する場合は結果を/ tmp-1のファイルに書き込み、存在しない場合は0を書き込みます。その後、スクリプトを繰り返し実行すると、そのファイルがチェックされ、ファイルが0で、WIFI接続がまだ悪かった場合は、init 6コマンドを実行します。


3

hololeapソリューションは機能していると思います。

私のソリューションは、ネットワーク接続が機能しているかどうかをN分ごとに確認します(crontabの構成方法によって異なります)。チェックが失敗した場合、失敗を追跡します。失敗回数が5を超える場合、wifiを再起動しようとします(wifiの再起動が失敗した場合は、Raspberryを再起動することもできます。コメントを確認してください)。

スクリプトの最新バージョンを常に含むGitHubリポジトリは次のとおりです。https : //github.com/ltpitt/bash-network-repair-automation

これは、stackexchangeの一般的なポリシー(すべての回答にリンクが含まれているだけではない)、ファイルnetwork_check.shによると、コピーして好きなフォルダーに貼り付けます。インストール手順はスクリプトのコメントにあります。

#!/bin/bash
# Author:
# twitter.com/pitto
#
# HOW TO INSTALL:
#
# 1) Install ifupdown and fping with the following command:
# sudo apt-get install ifupdown fping
#
# 2) Then install this script into a folder and add to your crontab -e this row:
# */5 * * * * /yourhome/yourname/network_check.sh
#
# Note:
# If you want to perform automatic repair fsck at reboot
# remember to uncomment fsck autorepair here: nano /etc/default/rcS

# Let's clear the screen
clear

# Write here the gateway you want to check to declare network working or not
gateway_ip='www.google.com'

# Here we initialize the check counter to zero
network_check_tries=0

# Here we specify the maximum number of failed checks
network_check_threshold=5

# This function will be called when network_check_tries is equal or greather than network_check_threshold
function restart_wlan0 {
    # If network test failed more than $network_check_threshold
    echo "Network was not working for the previous $network_check_tries checks."
    # We restart wlan0
    echo "Restarting wlan0"
    /sbin/ifdown 'wlan0'
    sleep 5
    /sbin/ifup --force 'wlan0'
    sleep 60
    # If network is still down after recovery and you want to force a reboot simply uncomment following 4 rows
    #host_status=$(fping $gateway_ip)
    #if [[ $host_status != *"alive"* ]]; then
    #    reboot
    #fi
}

# This loop will run network_check_tries times and if we have network_check_threshold failures
# we declare network as not working and we restart wlan0
while [ $network_check_tries -lt $network_check_threshold ]; do
    # We check if ping to gateway is working and perform the ok / ko actions
    host_status=$(fping $gateway_ip)
    # Increase network_check_tries by 1 unit
    network_check_tries=$[$network_check_tries+1]
    # If network is working
    if [[ $host_status == *"alive"* ]]; then
        # We print positive feedback and quit
        echo "Network is working correctly" && exit 0
    else
        # If network is down print negative feedback and continue
        echo "Network is down, failed check number $network_check_tries of $network_check_threshold"
    fi
    # If we hit the threshold we restart wlan0
    if [ $network_check_tries -ge $network_check_threshold ]; then
        restart_wlan0
    fi
    # Let's wait a bit between every check
    sleep 5 # Increase this value if you prefer longer time delta between checks
done

編集1/26/2018:スクリプトをメモリ内で実行し、RaspberryのSDカードへの書き込みを避けるために、一時ファイルを削除しました。


1
このスクリプトは、一時的な切断での再起動を回避します。素晴らしい、ありがとう!
-wezzix

1
このスクリプトに大きな変更を加えたようです。私が理解したように、以前のバージョンは1つのパスを作成し、(tmpファイルの更新を含む)処理を行って終了します。ループは含まれていませんでした。むしろ、cronに依存して5分ごとに実行していました。ネットワークが5回連続してダウンした場合(つまり、約30分)、スクリプトはネットワークのリセットを試行します。これは質問に対する良い答えのように見えましたが、tmpファイルに書き込んだという事実は少し欠点でした。…(続き)
スコット

(続き)…新しいバージョンにはループが含まれ、5 ごとにネットワークをチェックします。ネットワークが5回連続して(つまり、約30分間)ダウンしている場合、スクリプトはネットワークのリセットを試行します。(これは質問が求めるものとは異なるようです。)そして、ここでは少し奇妙になります。5回連続のネットワーク障害を検出してネットワークをリセットすると、スクリプトは終了します。(そして、ついでに、ネットワークが実際に復旧したかどうかを確認せずに終了します。)…(続き)
スコット

(続き)…しかし、ネットワークが稼働している限り、スクリプト永久に実行され続け、ネットワークが失敗するのを待ちます。その間、cronは5分ごとにスクリプトを再起動し続けます。ネットワークが1時間稼働している場合、実行中のスクリプトのコピーが12個あります。そして、ネットワークに障害が発生した場合、これらの12個のプロセスは互いに非同期で実行ifdownifup、おそらくネットワークを修正しますが、そうでない場合もあります。………………………………………………………………………………何か誤解した場合は、説明してください。…(続き)
スコット

(続き)…(1)1年以上にわたって投稿された回答をこのように大幅に再設計する場合は、行ったことを言ってください。「スクリプトをメモリ内で実行するために一時ファイルを削除しました」は、変更の適切な説明ではありません。(2)正方形のペグ、円形のペグ、正方形の穴、および円形の穴のコレクションがあり、それらが正しく一致していないようです。ネットワークが稼働していることがわかると終了するようにスクリプトを変更するか、永久に実行するように変更し、crontabを変更してスクリプトを1回だけ(つまりブート時に)開始する必要があります。
スコット

0

私はmodiffied Pittoのスクリプトを私のMultitech MTAC loraWANゲートウェイ(なしfping)のために。ログファイルも追加しました。

#!/bin/bash
# Author: 
# twitter.com/pitto
#
# HOW TO INSTALL:
#
# 1) Install ifupdown with the following command:
# sudo apt-get install ifupdown
#
# 2) Create files in any folder you like (ensure that the filename variables, set below,
# match the names of the files you created) with the following commands:
# sudo touch /home/root/scripts/network_check_tries.txt &&
#                               sudo chmod 777 /home/root/network_check_tries.txt
# sudo touch /home/root/scripts/N_reboots_file.txt      &&
#                               sudo chmod 777 /home/root/N_reboots_file.txt
# sudo touch /home/root/scripts/network_check.log       &&
#                               sudo chmod 777 /home/root/network_check.log
#
# 3) Then install this script into a folder and add to your crontab -e this row:
# */5 * * * * /yourhome/yourname/network_check.sh
#
# Note:
# If additionally you want to perform automatic repair fsck at reboot
# remember to uncomment fsck autorepair here: nano /etc/default/rcS

# Specify the paths of the text file where the network failures count, reboot count,
# and log will be held:
network_check_tries_file='/home/root/network_check_tries.txt'
N_reboots_file='/home/root/N_reboots_file.txt'
log_file='/home/root/network_check.log'

# Save file contents into corresponding variables:
network_check_tries=$(cat "$network_check_tries_file")
N_reboots=$(cat "$N_reboots_file")


# If host is / is not alive we perform the ok / ko actions that simply involve
# increasing or resetting the failure counter
ping -c1 google.com
if [ $? -eq 0 ]
then
    # if you want to log when there is no problem also,
    # uncomment the following line, starting at "date".
    echo 0 > "$network_check_tries_file" #&& date >> "$log_file" && echo -e "-- Network is working correctly -- \n" >> "$log_file"
else
    date >> "$log_file" && echo -e "-- Network is down... -- \n" >> "$log_file" && echo "$(($network_check_tries + 1))" > "$network_check_tries_file"
fi

# If network test failed more than 5 times (you can change this value to whatever you
# prefer)
if [ "$network_check_tries" -gt 5 ] 
then
    # Time to restart ppp0
    date >> "$log_file" && echo "Network was not working for the previous $network_check_tries checks." >> "$log_file" && echo "Restarting ppp0" >> "$log_file"
    killall pppd
    sleep 20
    /usr/sbin/pppd call gsm
    sleep 120
    # Then we check again if restarting wlan0 fixed the issue;
    # if not we reboot as last resort
    ping -c1 google.com
    if [ $? -eq 0 ]
    then
        date >> "$log_file" && echo -e "-- Network is working correctly -- \n" >> "$log_file" && echo 0 > "$network_check_tries_file"
    else
        date >> "$log_file" && echo -e  "-- Network still down after ifdownup... reboot time!-- \n" >> "$log_file" && echo 0 > "$network_check_tries_file" && echo "$(($N_reboots + 1))" > "$N_reboots_file" && reboot
    fi
fi

(1)ifupdown使用しないのに、なぜまだ話をするのですか?(2)なぜgateway_ip変数からハードコードされた定数に変更したのですか?
スコット

こんにちはスコット、私はifup ifdownコメントを消すのを忘れました。ハードコードされたgatewy_ipを変更するのを忘れました。
user3036425

いいね!一時ファイルを使用しない新しいバージョンを追加しました(RaspberryのSDに書き込むことはそれほど良い考えではありませんでした)。私の答えで確認できます。
ピット

このスクリプトは、元のバージョンのPittoのスクリプトにあったいくつかの問題を継承しています(その後修正されています):(1)ネットワークが00:00:01(深夜1秒後)から停止している場合、 00:35(つまり、35分後、7回目のチェック)まで反応します。これは、network_check_tries_fileファイル内の値をインクリメントしても(ping失敗した場合)、network_check_tries変数をインクリメントしないためです。…(続き)
スコット

(続き)…したがって、スクリプトは7回(00:05、00:10、00:15、00:20、00:25、00:30、および00:35)実行されnetwork_check_tries、0、1 2、3、4、5、および6 — テストが成功するのは7回目の呼び出し(network_check_tries6に等しい)のみif [ "$network_check_tries" -gt 5 ]です。おそらく、これは正しい動作です。スクリプトが知る限り、ネットワークは00:04:59にダウンした可能性があります。そのため、30分間をカバーしたことを確認するには7回連続して失敗します。…(続き)
スコット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.