내 Raspberry Pi 서버가 임의의 시간 후에 Wi-Fi 연결을 잃어 어떻게 든 자동으로 복구 할 수없는 것 같습니다.
일반적으로 손으로 재부팅하면 문제가 해결됩니다.
약 30 분 후에 Wi-Fi가없는 경우 자동으로 재부팅하고 싶습니다. 어떻게해야합니까?
내 Raspberry Pi 서버가 임의의 시간 후에 Wi-Fi 연결을 잃어 어떻게 든 자동으로 복구 할 수없는 것 같습니다.
일반적으로 손으로 재부팅하면 문제가 해결됩니다.
약 30 분 후에 Wi-Fi가없는 경우 자동으로 재부팅하고 싶습니다. 어떻게해야합니까?
답변:
이것은 단계별 지침만으로 본질적으로 Warwick의 답변입니다.
홈 폴더에 다음 쉘 스크립트를 작성하십시오.
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
실행 가능하도록 권한 변경
$ chmod +x check_inet.sh
다음 줄을 /etc/crontab
사용하여 수정 sudo
하고 추가 yourname
하십시오 (실제 사용자 이름으로 바꿉니다).
*/30 * * * * /home/yourname/check_inet.sh
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 카드에 쓰지 않도록 임시 파일을 제거했습니다.
ifdown
그리고 ifup
, 어쩌면 네트워크를 고정하고, 아마. ………………………………………………… 내가 잘못 이해 한 경우, 나에게 설명해주십시오. … (계속)
나는 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
ifupdown
않습니까? (2) 왜 gateway_ip
변수에서 하드 코딩 된 상수로 변경 했습니까?
network_check_tries_file
파일 의 값이 증가하더라도 ( ping
실패한 경우) network_check_tries
변수를 증가시키지 않기 때문 입니다. … (계속)
network_check_tries
0, 1 과 동일하게 7 번 (00:05, 00:10, 00:15, 00:20, 00:25, 00:30 및 00:35) 실행됩니다 . 2, 3, 4, 5 및 6- 테스트가 성공한 것은 7 번째 호출 ( network_check_tries
6 과 동일) 에만 if [ "$network_check_tries" -gt 5 ]
있습니다. 틀림없이 이것은 올바른 행동입니다. 스크립트가 아는 한, 네트워크는 00:04:59에 다운되었을 수 있으므로 30 분 동안 보장하려면 7 번 연속 실패가 발생합니다. … (계속)