我正在尝试编写一个小型 bash 脚本来检查互联网连接。如果未检测到互联网,它会在 10 分钟后再次尝试...如果仍然没有互联网,它会重新启动计算机。到目前为止,我已经写了这个。任何建议改进/效率/更好代码的想法都值得赞赏。
#!/bin/bash
# Script to restart the computer if there is no internet connection
# within the next 10 minutes of whenever the script is run, which
# I'll setup via crontab to run every half an hour.
IS=`/bin/ping -c 5 8.8.8.8 | grep -c "64 bytes"`
if (test "$IS" -gt "2") then
internet_conn="1"
exit
else
internet_conn="0"
sleep 600
AA=`/bin/ping -c 5 74.125.226.18 | grep -c "64 bytes"`
if (test "$AA" -gt "2") then
internet_conn="1"
exit
else
sudo shutdown -r now
fi
fi
答案1
我认为您的脚本应该可以正常工作,但您可能需要检查多个地方,而不仅仅是一个 DNS 服务器。当然,这是一个可能永远不会关闭的大型 DNS,但如果他们恰好正在对该 IP 进行维护,您不想重新启动服务器,因此我可能会检查三个来源,如果它们都显示为关闭,则重新启动服务器。
此外,关闭接口并备份而不是重新启动是否更为明智?
答案2
小建议,您不需要 grep 来评估 ping 是否成功。如果成功,Ping 将以 0 退出,如果发生错误,则以 1 或更高的值退出。因此,您也可以按以下方式编写脚本。$? 变量显示最后执行的命令的返回代码。
/bin/ping -c 5 8.8.8.8
if ( $? -ge 1); then
......
fi
答案3
这是一种使用at
10 分钟后重新安排时间再次检查。
#!/bin/bash
count=${1:-1}
if /bin/ping -c 5 8.8.8.8 2>&/dev/null; then
if [ $count -eq 2 ]; then
sudo shutdown -r now
else
at now + 10 minutes <<< "$0 $((count + 1))"
fi
fi
答案4
这个答案适用于 2019 年及以后的人:
我尝试使用@rkokkelk 的答案,但它似乎不起作用,如果我没有看错的话,bash 文档证实了这一假设。
因此,我向您介绍我的个人方法(我知道这并不有效,但我希望如此):
#!/bin/bash
# Restarts computer after 90 minutes of no internet connection.
/bin/ping -c 20 8.8.8.8
if [ "$(echo $?)" == 1 ]; then
sleep 15
/bin/ping -c 20 8.8.4.4
if [ "$(echo $?)" == 1 ]; then
sleep 5400
/bin/ping -c 20 8.8.8.8
if [ "$(echo $?)" == 1 ]; then
sleep 15
/bin/ping -c 20 8.8.4.4
if [ "$(echo $?)" == 1 ]; then
shutdown -r now
else
exit
fi
else
exit
fi
else
exit
fi
else
exit
fi
这与 兼容bash version 4.4.12(1)-release
。