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를 사용하는 것입니다. 스크립트를 세 가지 변경했습니다.

  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과 비교하여 시간 초과가 발생했는지 확인할 수 있습니다.

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      

관련 정보