bash 루프가 x초에 x번 실행되는 경우 강제로 종료하는 방법은 무엇입니까?

bash 루프가 x초에 x번 실행되는 경우 강제로 종료하는 방법은 무엇입니까?

SSH를 통해 원격 파이프에서 대량 입력을 얻으려고 합니다. 아래 스크립트는 잘 작동하지만 뭔가 잘못되거나 루프가 끊어지면 스크립트가 실행되기 시작하면 루프가 종료되도록 일종의 검사를 추가하고 싶습니다.

루프가 3초에 5번 실행되는지 확인하는 구성 요소를 어떻게 추가할 수 있습니까? 그러면 스크립트가 루프를 중단하고 자동으로 종료됩니까?

#!/bin/sh
if [ -z "$1" ]
    then
    echo " usage: user@host"
    echo
    exit
fi


while [ 1 ]
    do
    CB=`ssh $1 cat clipboardpipe`
    if [ -n "$CB" ]
        then
        echo $CB | /usr/bin/pbcopy
        echo $CB | /usr/local/bin/growlnotify
    fi
    sleep 1
done

ps: 비슷한 것을 사용해 보았는데 tail -f, 다른 프로그램에서 일괄 입력이 필요한 경우에는 작동하지 않는 것 같습니다. 모든 제안을 환영합니다.

pss: clipboardpipe원격 시스템의 홈 디렉터리에 있는 명명된 파이프입니다.

답변1

GNU가 date통과했습니다 %N.

every=3     # test every n'th itteration 
bsecs=0.95  # break at secs (float)
bnano=$(printf '%0.9f' "$bsecs"); bnano=${bnano/./};  
# avoid lead '0' octal clash when time slice < 1 sec
shopt -s extglob; bnano=${bnano#+(0)}  

tprev=$(date +%s%N)
for i in {1..24} ;do  # just a test loop

  if ((i%every==1)) ;then
    tnow=$(date +%s%N)
    if ((tnow-tprev>=bnano)) ;then 
        echo "Auto Break!  $every itteratons took longer than $bsecs secs"
        break
    fi
    ((tprev=tnow))
  fi
  # do something, eg sleep for testing
  sleep 1.$i; echo $i
done

답변2

Linux를 사용하는 경우 다음을 사용할 수 있습니다.정지시키다coreutils 패키지에서 제공하는 명령입니다.

시간 초과 문서

관련 정보