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を使用することです。スクリプトを3つ変更しました。

  1. sh-bang行を/bin/shから/bin/bashに変更します。
  2. while$ SECONDSを50と比較するためにテストする2番目の条件を追加しました。
  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と比較してタイムアウトが発生したことを確認できます。

ping$SECONDS == 49でループを入力でき、成功または失敗に1秒以上かかることがあるため、これは約50秒の推定値です。

答え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      

関連情報