树莓派WiFi有时候信号不好会断,并不会自动重新连网。解决办法是:写一个自动断网重连的脚本,让pi定时执行并检查网络是否连通,如断网则自动重新连接。连接还是失败,重启。
1)在 /etc/network/if-down.d/ 文件夹下新建net_restart.sh脚本用于当网络断开时重新启动网络:sudo nano /etc/network/if-down.d/net_restart.sh
#!/bin/bash
#定义几个IP供访问,如果访问失败,返回一般是000
urls=("www.baidu.com" "192.168.1.1" "10.86.159.237:8080")
http_code=("200" "301" "302" "404")
count=${#urls[*]}
connected=0
echo "start to check net!"
echo "bash file in /etc/network/if-down.d/net_restart.sh"
#函数,每个网站访问一下看结果,有一个能通就行
function check_linkstatus {
for ((i=0; i < $count; i++));
do
url=${urls[i]}
echo $url
#result=$(curl -o /dev/null -s -m 10 -w %{http_code} $url)
result=$(curl -m 10 -o /dev/null -s -w %{http_code} $url)
for flag in ${http_code};
do
if [ $flag -eq $result ];then
connected=$(expr $connected + 1)
echo "net ok!"
fi
done
done
}
# 函数 , 写个log
function write_log ( ) {
logfilename=/home/pi/log/networklog.txt
date>>$logfilename
echo $1>>$logfilename
}
check_linkstatus
#if net is down then restart or reboot
if [ $connected -eq 0 ];then
echo "network is not very well!"
echo "restart net!"
write_log "restart net!"
#这个restart好像没用,会报错,但是wifi down/up一下也可以
#sudo /etc/init.d/networking restart
sudo ip link set wlan0 down
sudo ip link set wlan0 up
#sudo /sbin/ifup eth0
connected=0
# 等一会儿看效果,再测一次。
sleep 10
sudo ip link set wlan0 up
sleep 10
check_linkstatus
# 如果还是不行,重启
if [ $connected -eq 0 ];then
write_log "reboot!"
echo $cur_date reboot
sudo shutdown -r now
exit 0
else
echo $cur_date restart wlan0 ok!
exit 0
fi
fi
保存退出,添加权限:sudo chmod +x /etc/network/if-down.d/net_restart.sh
可以先用不可达的网站如www.bai_du.com 运行测试一下: sh /etc/network/if-down.d/net_restart.sh
可能会报错:Syntax error: “(“ unexpected.
因为Ubuntu/Debian为了加快开机速度,用dash代替了传统的bash,是dash在捣鬼,解决方法就是取消dash:sudo dpkg-reconfigure dash 在选择项中选No,搞定。
2)添加定时任务检测:sudo crontab -e 在文件尾添加,5分钟检测一次网络:
*/5 * * * * /etc/network/if-down.d/net_restart.sh
注意:crontab -e 打开的cron定时任务文件并不是 /etc/crontab ,而是在 /var/spool/cron/crontabs/ 目录下的文件:pi ,root 。每个用户(pi ,root)分别有cron定时任务的。
树莓派默认系统下启动、重启、停止、查询cron状态的命令
service cron start
service cron restart
service cron stop
service cron status
树莓派默认系统下设置crontab【定时任务】为开机启动和开机不启动
systemctl is-enabled cron.service --- 查看crond是否为开机自启动
systemctl enable cron.service --- 将服务设置为开启启动
systemctl disable cron.service --- 关闭服务开机自启动