Bash:while 循环中的计时器

Bash:while 循环中的计时器

我的脚本中有一个 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 启动以来的秒数。我对脚本做了三处更改:

  1. 将 sh-bang 行从 /bin/sh 更改为 /bin/bash
  2. 在测试中添加了第二个条件while以将 $SECONDS 与 50 进行比较
  3. $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      

相关内容