Как принудительно завершить цикл bash, если он выполняется x раз за x секунд?

Как принудительно завершить цикл bash, если он выполняется x раз за x секунд?

Я пытаюсь получить пакеты ввода из удаленного канала через ssh. Мой скрипт ниже работает нормально, но я хотел бы добавить в него какую-то проверку, чтобы в случае, если что-то пойдет не так или прервется, цикл завершится, если скрипт начнет уходить.

Как добавить компонент, который будет проверять, выполняется ли цикл, скажем, 5 раз за 3 секунды, после чего скрипт прерывает цикл и автоматически завершается?

#!/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.

документация по тайм-ауту

Связанный контент