自动重启,如果在一定时间内没有WiFi连接


14

似乎我的Raspberry Pi服务器在随机时间后失去了wifi连接,并且某种程度上无法自动恢复。

通常,手动重新启动可以解决问题。

如果大约30分钟后没有wifi,我想使其自动重启。我怎样才能做到这一点?


5
您是否尝试过关闭接口并将其恢复?如何为无线网卡卸载和重新加载内核模块?您可能需要采取其他措施来重置卡而无需重新启动。
hololeap 2014年

1
是的,这也许也可以,但是这里的主要问题是如何自动检测到该错误,然后执行适当的操作。
夹紧

Answers:


12

本质上,这是沃里克的答案,只需分步说明即可。


  1. 在您的主文件夹中创建以下shell脚本:

    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

一种方法是将条目放置在root的cron中,该条目每30分钟运行一次脚本。该脚本可能会使用来测试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

编辑2018年1月6日:我删除了临时文件,以使脚本在内存中运行并避免在Raspberry的SD卡上写入。


1
此脚本避免在临时断开连接时重新启动。太好了,谢谢!
wezzix

1
您似乎对该脚本进行了重大更改。据我了解,以前的版本只能通过一次,完成所有工作(包括更新tmp文件),然后退出。它不包含任何循环;而是依靠cron每五分钟运行一次。如果网络连续五次关闭(即大约半小时),则脚本将执行一些操作来尝试重置网络。尽管将其写入tmp文件的事实有些缺点,但这似乎是对该问题的很好答案。…(续)
斯科特

(续)…新版本包含一个循环,并每五秒钟检查一次网络。如果网络连续五次关闭(即大约半分钟),则脚本将执行一些操作来尝试重置网络。(这似乎与问题的要求有所不同。)在这里,它变得有些奇怪。在检测到连续五次出现网络故障并重置网络后,脚本将退出。(而且,顺便说一句,它退出时根本没有检查网络是否真的恢复过。)……(续)
Scott

(续)…但是,只要网络启动,脚本就会一直运行,并等待网络故障。同时,cron会每隔五分钟重新启动一次脚本。如果网络保持一个小时,则将运行十二个脚本副本。而且,如果网络出现故障,那么这十几个进程将相互争斗,异步进行ifdownifup,可能会修复网络,可能不会。…………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………… …(续)
斯科特

(续)…(1)如果要对已经发布了一年以上的答案进行如此重大的重新设计,您应该说自己做了什么。“为了使脚本在内存中运行,我已删除了临时文件”不足以说明您所做的更改。(2)似乎您有方钉,圆钉,方孔和圆孔的集合,但还没有正确地将它们配对。您应该修改脚本以使其在看到网络启动时退出,或者将其修改为永久运行,然后更改crontab使其仅启动脚本一次(即在启动时)。
斯科特(Scott)

0

我将Pitto 的脚本修改为我的多功能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从变量更改为硬编码常量?
Scott

嗨,斯科特,我忘了写ifup ifdown注释了。我忘了更改硬编码的gatewy_ip。
user3036425

真好!我添加了一个不使用临时文件的新版本(在Raspberry SD上写不是一个好主意),您可以在我的答案中进行检查。
皮托

该脚本继承了Pitto脚本原始版本中的几个问题(随后已得到纠正):(1)如果从00:00:01(午夜之后一秒)开始网络中断,则该脚本不会直到00:35(即35分钟后,在第七次检查时)作出反应,因为即使它增加了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 -测试仅在第七次调用(network_check_tries等于6)时if [ "$network_check_tries" -gt 5 ]成功。可以说,这是正确的行为。据脚本所知,网络可能在00:04:59中断,因此需要连续七次失败才能确保您覆盖了30分钟。…(续)
斯科特,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.