一定期間 Wi-Fi 接続がないと自動的に再起動します。

一定期間 Wi-Fi 接続がないと自動的に再起動します。

私のRaspberry Piサーバーは、ランダムな時間が経つとWi-Fi接続が失われ、自動的に回復しないようです。

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

Wi-Fiが接続されていない状態で約30分後に自動的に再起動したいと思います。どうすればいいですか?

答え1

これは本質的にステップバイステップの指示を含むWarwickの答えです。


  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します(実際のユーザー名に置き換えます)。sudoyourname

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

答え2

1つの方法は、ルートのcronにエントリを追加して30分ごとにスクリプトを実行することです。このスクリプトはWIFI接続(おそらくWIFIを使用)をテストpingし、結果を/ tmpのファイルに書き込みます。接続がある場合は1、ない場合は0です。スクリプトの以降の反復では、このファイルを確認し、そのファイルがゼロでWIFI接続がまだ悪い場合は、コマンドを実行しますinit 6

答え3

Hololeapソリューションがうまくいくと思います。

私のソリューションは、動作しているネットワーク接続があるかどうかをN分ごとにチェックします(crontabの設定方法に応じて)。検査が失敗した場合は、失敗を追跡します。失敗回数が5より大きい場合は、Wi-Fiを再起動してみました。 Wi-Fiの再起動が失敗した場合は、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

2018年1月26日編集:スクリプトがメモリ内で実行され、RaspberryのSDカードに書き込まないように一時ファイルを削除しました。

答え4

スクリプトの作成checkconnection.sh

#!/bin/bash

ping -c4 www.google.com
let a=$?
if [ "$a" != "0" ]; then
  /sbin/shutdown -r +1 Connection lost, rebooting...
fi

実行可能な権限を変更します。

chmod +x check_connection.sh

/etc/crontab使用するには編集してくださいSudoこれにより、30分ごとに古いスクリプトが起動します。

sudo crontab -e

そして次の行を追加してください:

*/30 * * * * /home/yourname/check_connection.sh

関連情報