일정 기간 동안 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

한 가지 방법은 루트의 cron에 항목을 추가하여 30분마다 스크립트를 실행하는 것입니다. 이 스크립트는 WIFI 연결(아마도 WIFI 사용)을 테스트 ping하고 결과를 /tmp에 있는 파일에 기록합니다. 연결이 있으면 1, 없으면 0입니다. 스크립트의 후속 반복에서는 이 파일을 확인하고 해당 파일이 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사용하려면 편집하세요스도이렇게 하면 30분마다 이전 스크립트가 시작됩니다.

sudo crontab -e

그리고 다음 줄을 추가하세요:

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

관련 정보