특정 시간 동안 Wi-Fi 연결이없는 경우 자동으로 재부팅


14

내 Raspberry Pi 서버가 임의의 시간 후에 Wi-Fi 연결을 잃어 어떻게 든 자동으로 복구 할 수없는 것 같습니다.

일반적으로 손으로 재부팅하면 문제가 해결됩니다.

약 30 분 후에 Wi-Fi가없는 경우 자동으로 재부팅하고 싶습니다. 어떻게해야합니까?


5
인터페이스를 중단 한 후 다시 시작해 보셨습니까? 무선 카드의 커널 모듈을 언로드했다가 다시로드하는 것은 어떻습니까? 재부팅하지 않고 카드를 재설정하기 위해 다른 방법이있을 수 있습니다.
hololeap

1
그렇습니다. 아마도 이것도 효과가있을 것입니다. 그러나 여기서 가장 큰 이슈는 이것을 자동으로 감지하고 적절한 조치를 수행하는 방법입니다.
클램프

답변:


12

이것은 단계별 지침만으로 본질적으로 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사용하여 수정 sudo하고 추가 yourname하십시오 (실제 사용자 이름으로 바꿉니다).

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

5

한 가지 방법은 30 분마다 스크립트를 실행하는 항목을 루트의 크론에 넣는 것입니다. 스크립트는 아마도를 사용하여 WIFI 연결을 테스트하고 ping연결이 존재하는 경우 / tmp-1의 파일에 결과를 씁니다 (없는 경우 0). 이후에 스크립트를 반복하면 해당 파일을 확인하고 파일이 0이고 WIFI 연결이 여전히 불량한 경우 init 6명령을 실행하십시오 .


3

hololeap 솔루션이 효과가 있다고 생각합니다.

내 솔루션은 작동하는 네트워크 연결을 위해 N 분마다 (crontab을 구성하는 방법에 따라) 확인합니다. 검사가 실패하면 실패를 추적합니다. 실패 횟수가 5보다 크면 Wi-Fi를 다시 시작하려고 시도합니다 (Wi-Fi 재시작에 실패하면 의견을 확인하십시오).

다음은 항상 최신 버전의 스크립트를 포함하는 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
이 스크립트를 크게 변경 한 것 같습니다. 내가 이해했듯이, 이전 버전은 하나의 패스를 만들고 (tmp 파일 업데이트 포함) 작업을 수행하고 종료합니다. 루프를 포함하지 않았습니다. 오히려 5 분마다 cron을 실행해야했습니다. 네트워크가 5 번 연속 점검 (예 : 약 30 분 동안) 된 경우 스크립트는 네트워크를 재설정하려고 시도합니다. 이것은 tmp 파일에 쓴 사실이 약간의 단점 이었지만 질문에 대한 좋은 대답 인 것처럼 보였습니다. … (계속)
Scott

(계속)… 새 버전에는 루프가 포함되어 있으며 5 마다 네트워크를 확인합니다 . 네트워크가 5 번의 연속 점검 (예 : 약 0.5 분 ) 동안 작동 중지 된 경우 스크립트는 네트워크 재설정을 시도합니다. (이것은 질문이 요구하는 것과는 다른 것 같습니다.) 그리고 여기에 조금 이상해집니다. 연속 된 5 번의 네트워크 오류를 감지하고 네트워크를 재설정하면 스크립트가 종료됩니다. (그리고 우연히도 네트워크가 실제로 백업되었는지 여부를 확인하지 않고 종료됩니다.)… (계속)
Scott

(계속)… 그러나 네트워크가 작동 하는 한 스크립트는 계속 실행 되며 네트워크 장애가 발생할 때 까지 기다립니다. 한편 cron은 5 분마다 스크립트를 다시 시작합니다. 네트워크가 한 시간 동안 유지되면 수십 개의 스크립트 사본이 실행됩니다. 네트워크가 실패한다면, 다음, 그 다스 프로세스는 비동기하고, 서로 전투를 할 것입니다 ifdown그리고 ifup, 어쩌면 네트워크를 고정하고, 아마. ………………………………………………… 내가 잘못 이해 한 경우, 나에게 설명해주십시오. … (계속)
Scott

(계속) ... (1) 1 년 넘게 게시 된 답변의 주요한 재 설계를하려는 경우 수행 한 내용을 말해야합니다. “스크립트가 메모리에서 실행되도록 임시 파일을 제거했습니다”는 변경 사항에 대한 적절한 설명이 아닙니다. (2) 네모 난 못, 둥근 못, 사각형 구멍, 둥근 구멍이 있고, 맞지 않는 것 같습니다. 네트워크가 작동하는 것을 확인하면 종료되도록 스크립트를 수정하거나 영원히 실행되도록 수정하고 crontab을 변경하여 스크립트를 한 번만 시작하십시오 (부팅시).
Scott

0

나는 multitech mtac loraWAN 게이트웨이에 대한 Pitto의 스크립트 를 수정했습니다 (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변수에서 하드 코딩 된 상수로 변경 했습니까?
Scott

안녕 스캇, ifup ifdown 코멘트를 삭제하는 것을 잊었다. 하드 코드 된 gatewy_ip를 변경하는 것을 잊었습니다.
user3036425

좋은! 임시 파일을 사용하지 않는 새 버전을 추가했습니다 (Raspberry의 SD에 쓰는 것은 그리 좋은 생각이 아닙니다). 내 대답에서 확인할 수 있습니다.
Pitto

이 스크립트는 원래 버전의 Pitto 스크립트에서 발생했던 몇 가지 문제를 상속합니다 (이후 수정 됨). 00:35까지 (즉, 35 분 후, 일곱 번째 검사에서) 반응합니다. network_check_tries_file파일 의 값이 증가하더라도 ( ping실패한 경우) network_check_tries변수를 증가시키지 않기 때문 입니다. … (계속)
Scott

(계속)… 따라서 스크립트는 network_check_tries0, 1 과 동일하게 7 번 (00:05, 00:10, 00:15, 00:20, 00:25, 00:30 및 00:35) 실행됩니다 . 2, 3, 4, 5 및 6- 테스트가 성공한 것은 7 번째 호출 ( network_check_tries6 과 동일) 에만 if [ "$network_check_tries" -gt 5 ]있습니다. 틀림없이 이것은 올바른 행동입니다. 스크립트가 아는 한, 네트워크는 00:04:59에 다운되었을 수 있으므로 30 분 동안 보장하려면 7 번 연속 실패가 발생합니다. … (계속)
Scott
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.