x초에 x번 실행되는 경우 bash 루프를 강제로 종료하려면 어떻게 해야 합니까?

x초에 x번 실행되는 경우 bash 루프를 강제로 종료하려면 어떻게 해야 합니까?

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

추신: 다음과 같은 것을 사용해 보았지만 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 패키지에서 제공하는 명령입니다.

시간 초과 문서

관련 정보