我有一个 Raspberry Pi,用作本地网络的 NAS。它工作正常,但是当我关闭 pi 连接的路由器时,它会永久失去连接。为了能够再次连接到网络,必须重新启动它。因此我写了这个脚本:
#!/bin/bash
if ! ping -q -w 1 -c 1 $(ip r | grep default | cut -d ' ' -f 3)
then
service networking restart
sleep 60
if ! ping -q -w 1 -c 1 $(ip r | grep default | cut -d ' ' -f 3)
then
reboot
fi
fi
它基本上会尝试 ping 路由器。如果失败,它将重新启动网络服务(当发生简单错误并且不需要重新启动时)。如果仍然无法 ping 通路由器,则会重新启动。我将其设置为每 10 分钟执行一次 cronjob,但它不起作用。我究竟做错了什么?
我把这一行放在 crontab 中:
0,10,20,30,40,50 * * * * /root/rebooter.sh >> rebooter.log 2>&1
没有连接,这是输出:
Usage: ping [-LRUbdfnqrvVaAD] [-c count] [-i interval] [-w deadline]
[-p pattern] [-s packetsize] [-t ttl] [-I interface]
[-M pmtudisc-hint] [-m mark] [-S sndbuf]
[-T tstamp-options] [-Q tos] [hop1 ...] destination
/root/rebooter.sh: Line 5: service: Command not found.
Usage: ping [-LRUbdfnqrvVaAD] [-c count] [-i interval] [-w deadline]
[-p pattern] [-s packetsize] [-t ttl] [-I interface]
[-M pmtudisc-hint] [-m mark] [-S sndbuf]
[-T tstamp-options] [-Q tos] [hop1 ...] destination
/root/rebooter.sh: Line 11: reboot: Command not found.
连接后,输出如下:
PING 192.168.178.1 (192.168.178.1) 56(84) bytes of data.
--- 192.168.178.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.985/0.985/0.985/0.000 ms
答案1
我认为问题出在你的if
表述上。
if ! ping -q -w 1 -c 1 $(ip r | grep default | cut -d ' ' -f 3)
进一步来说:
ping -q -w 1 -c 1 $(ip r | grep default | cut -d ' ' -f 3)
主机ip
未正确传递。
请注意,每个部分都独立工作(即ping host
和ip r....
)。
这对我来说一直有效:
$ ip r | grep "default" | cut -d ' ' -3 | xargs ping -q -w 1 -c 1
尝试将其与您的if
陈述结合起来。
xargs
获取之前管道的输出并将其用于ping
,而之前 ip 并未传递到ping
代码的一半。在命令行中尝试一下:-)
更改为netstat
rathern,ip r
它也适用于 Pi,但足够通用,可以在其他 Linux 发行版上使用。
下面的脚本:
0
它正确地获取要 ping 的主机名,并在出现(输入,即设备断开连接时)的情况下输入语句。
if
还用括号重新构造了语句[]
,并为更清晰的语句分配了一个变量。
#!/bin/bash
test_host=`netstat -nr | grep "UG" | awk '{ print $2}' | xargs ping -q -w 1 -c 1 | grep "received" | awk '{ print $4 }'`
if [ "$test_host" == "0" ] || [ -z "$test_host" ] ;
then
echo "service networking restart"
sleep 60
test_host=`netstat -nr | grep "UG" | awk '{ print $2}' | xargs ping -q -w 1 -c 1 | grep "received" | awk '{ print $4 }'`
if [ "$test_host" == "0" ] || [ -z "$test_host" ] ;
then
echo "reboot"
fi
fi