web-dev-qa-db-ja.com

Bash:whileループのタイマー

スクリプトにwhileループがあり、接続がオンラインになるのを待ってから続行します。

#!/bin/sh

while ! ping -c1 $1 &>/dev/null
        do echo "Ping Fail - `date`"
done
echo "Host Found - `date`"

接続が再接続するまでに25〜45秒かかります。 50秒以上待てない。ループが機能する時間を制限する最善の解決策は何でしょうか?

2
Vladimir P

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      
5
nst0022

大まかなカットは、シェルが起動してからの秒数をカウントするbash特殊変数$ SECONDSを使用することです。スクリプトに3つの変更を加えました。

  1. sh-bang行を/ bin/shから/ bin/bashに変更しました
  2. $ SECONDSを50と比較するためにwhileテストに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と比較して、タイムアウトが発生したかどうかを判断できます。

$ SECONDS == 49でループに入る可能性があり、pingが成功または失敗するまでに1秒以上かかる可能性があるため、これはおよそ50秒の見積もりです。

4
Jeff Schaller