180*_*man 4 bash shell-script ping
我正在研究一些自定义的 Openwrt 编译。我的一些脚本在做他们的事情之前做 ping 测试连接。
if [ "$(ping -c 1 -w 3 8.8.8.8)" ]; then
do stuff;
else
echo "no connection"
fi
Run Code Online (Sandbox Code Playgroud)
其中一些运行其他脚本,因为ping需要一些时间,所以运行脚本需要的时间比它应该的要多,这在某些情况下是一个问题。
我想做某种连续循环,将 0 或 1 写入某个文件。从现在开始,使用 ping 进行连接测试的脚本将测试somefile.
有没有办法编写这样的脚本?
ter*_*don 12
你的意思是这样简单吗:
while :; do
ping -c 1 -w 3 8.8.8.8; echo $? > /tmp/ping.status
sleep 1
done
Run Code Online (Sandbox Code Playgroud)
这将每秒写入一次pingto的退出状态/tmp/ping.status。然后,在另一个脚本中,您可以使用以下内容:
pingFailed=$(cat /tmp/ping.status)
if [ $pingFailed -ne 0 ]; then
echo "No connection"
else
echo "Connected!"
fi
Run Code Online (Sandbox Code Playgroud)
所以是的,你可以这样做。但是,这是检查连接的一种非常糟糕的方法。显然,这里存在竞争条件。第一个循环运行时连接处于活动状态,并不意味着它在第二次处于活动状态。更重要的是,如果您ping.status在脚本开始时读取文件,这并不意味着连接将在脚本结束时仍然存在。此外,您正在通过连续请求向网络和 CPU 发送垃圾邮件。这真的不是很优雅。
测试,如果你的连接起来(至少在Linux上)的速度更快,更简单的方法是看/sys/class/net/$NIC/link_mode哪里$NIC是你的网卡的名称。例如,在我的系统上:
## Wireless connection up
$ cat /sys/class/net/wlp3s0/link_mode
1
## Wireless connection down
$ cat /sys/class/net/wlp3s0/link_mode
0
Run Code Online (Sandbox Code Playgroud)
您可以编写一个函数来检查:
isLinkDown(){
return $(cat /sys/class/net/wlp3s0/link_mode)
}
Run Code Online (Sandbox Code Playgroud)
您可以像这样在脚本中使用它:
if isLinkDown; then
echo Link Down
else
echo Link Up
Run Code Online (Sandbox Code Playgroud)