linux - 在 shell 脚本中检查连接
问题描述
我在 shell 脚本中使用 ping 检查连接。脚本如下所示。
ping -c 1 8.8.8.8 >> log.txt
if [ "$?" == "0" ] ; then
echo "Success" >> log.txt
else
echo "Failed" >> log.txt
fi
但有时即使网络运行良好,它也无法连接。所以我将 -c 选项更改为 5 而不是 1。
然后有时日志打印如下。
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=119 time=113 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=119 time=113 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=119 time=114 ms
64 bytes from 8.8.8.8: icmp_seq=5 ttl=119 time=116 ms
--- 8.8.8.8 ping statistics ---
5 packets transmitted, 4 received, 20% packet loss, time 4001ms
rtt min/avg/max/mdev = 113.315/114.555/116.154/1.173 ms
“美元?” 仅包含上次尝试的结果。所以即使 ping 成功 4 次最后失败 1 次,脚本也会说连接失败。
我对此有一个想法,但无法将其写在 shell 脚本上,因为我对它不友好。
如果我用 C++ 语言编写它,它会变成这样。
bool result = 1;
for(i=0; i<5; i++)
{
[try ping and save return code at a]
result = result&a;
}
if(result)
cout >> "Success";
else
cout >> "Failed";
所以这意味着我尝试 ping 5 次,如果有一个或多个返回码“0”,则打印“Success”。
如何使用 shell 脚本执行此操作?
解决方案
更好的功能
#!/usr/bin/env sh
chk_ping ()
{
# Set count with argument 1 or default 5
count=${1:-5}
# Perform count checks
while [ $count -gt 0 ]
do
count=$(count - 1)
# If it got a pong, it can return success
if ping -qn4c1 8.8.8.8 >/dev/null
then return
fi
done
# It reaches here if all ping checks failed, so return failure
return 1 # failure
}
if chk_ping 3
then
echo 'successful ping'
else
echo 'all pings failed'
fi
推荐阅读
- cmake - 无法在调试构建配置中使用 assimp 库
- java - com.google.firebase.database.Query 无法转换为 com.google.firebase.database.DatabaseReference
- python - % 差异数据透视表 python
- google-cloud-firestore - 存储选择器中的选定值以在其他视图中使用 - SwiftUI
- c++ - 如何使用 QStyledItemDelegate 在 QTreeWidget 中拥有不同高度的 QTreeWidgetItems?
- html - 将文本保留在 div 中
- javascript - 如何删除大函数中未使用的方法?
- python - AttributeError:模块“tensorflow”没有属性“resize_nearest_neighbor”
- gradle - 如何与 buildSrc 和子项目之一共享一些类?
- php - 使用 PHP 将虚幻颜色代码转换为 HTML/CSS RGBA 或十六进制