我的脚本中有一个 while 循环,它等待连接上线然后继续。
#!/bin/sh
while ! ping -c1 $1 &>/dev/null
do echo "Ping Fail - `date`"
done
echo "Host Found - `date`"
重新连接需要 25 到 45 秒。我不能让它等待超过 50 秒。限制 while 循环工作时间的最佳解决方案是什么?
答案1
一个粗略的做法是使用 bash 特殊变量 $SECONDS,它计算 shell 启动以来的秒数。我对脚本做了三处更改:
- 将 sh-bang 行从 /bin/sh 更改为 /bin/bash
- 在测试中添加了第二个条件
while
以将 $SECONDS 与 50 进行比较 - 引
$1
新脚本:
#!/bin/bash
while ! ping -c1 "$1" &>/dev/null; [[ "$SECONDS" -lt 50 ]]
do echo "Ping Fail - `date`"
done
echo "Host Found - `date`"
我只是想指出,Host Found
在 50 秒超时的情况下,该声明可能会产生误导。您可以在循环后将 $SECONDS 与 50 进行比较,以确定是否发生超时。
这是 50 秒的粗略估计,因为可以使用 $SECONDS == 49 进入循环,然后ping
可能需要超过一秒才能成功或失败。
答案2
没有 while 循环:
# -W 50 = timeout after 50 seconds
# -c 1 = 1 packet to be sent
response="$(ping -W 50 -c 1 "$1" | grep '1
packets transmitted, 1 received')"
if [ "$response" == '' ] ; then
echo no response after 50 seconds
else
echo connected
fi