我想为 ddwrt 创建一个脚本,在 4 台主机上执行 ping 操作以检查互联网是否可用。如果 4 项测试中,其中一项 ping 结果为真,则假设互联网正常工作,否则无连接。至少其中一项测试需要实现。
这是我一直在使用的脚本。
#!/bin/sh
result=`ping -c 1 8.8.8.8 | grep -c from`
sleep 10
result+=`ping -c 1 www.google.com | grep -c from`
# I want the output from this command to add into result variable. For example, if result value is 0 then add the value of next ping command into 0, same with the rest of the commands. Is that possible?
sleep 10
result+=`ping -c 1 www.microsoft.com | grep -c from`
sleep 10
result+=`ping -c 1 www.youtube.com | grep -c from`
if [ $result -ge 1 ]
then
echo "Internet alright"
logger -t 'InternetCheck' 'Internet is Connected'
logger "ping $result"
else
logger -t 'InternetCheck' 'After many ping tests, the Internet is not working... will apply solution'
logger "ping $result"
fi
虽然 ddwrt 已经带有看门狗,但我不希望路由器重新启动,而是想在此时运行命令来解决问题。请给我任何其他建议。
问候!
答案1
一些想法:
ping
有退出状态 - 如果收到响应则为 0,如果没有则为非 0。您可以使用它来代替 grep。- 您可能想要并行运行 4 个 ping 命令并用于
wait
等待它们。这样您就不必等待 4 次 ping 失败才知道您的互联网连接已断开。 - 或者,如果您的连接大部分时间都有效,您可能会在第一次成功 ping 后停止,因为您只想知道它是否有效,而不是可以到达多少个目的地。
该脚本(仅适用于 2 个 IP,不包括您的日志记录内容,您可以轻松扩展它)会在很短的时间后给出答案(您的脚本运行至少 30 秒 + 任何 ping 超时)并返回退出状态 0 或 1,具体取决于判断 ping 是否成功或全部失败。它使用-W选项来设置较短的超时;除非您的互联网连接确实不稳定,否则至少有一个地址应该在一秒钟之内返回响应。
#!/bin/sh
IP1=8.8.8.8
IP2=4.4.4.4
#start first ping, remember its pid
ping -W 1 -c 1 $IP1 >/dev/null&
PID1=$!
# start second ping, remember its pid
ping -W 1 -c 1 $IP2 >/dev/null&
PID2=$!
# wait for pings to finish
if wait $PID1
then echo $IP1 is reachable, internet is working; exit 0
fi
if wait $PID2
then echo $IP2 is reachable, internet is working; exit 0
fi
# none reachable
echo all pings failed, internet is down
exit 1