Como posso forçar o término de um loop bash se ele for executado x vezes em x segundos?

Como posso forçar o término de um loop bash se ele for executado x vezes em x segundos?

Estou tentando obter lotes de entrada de um canal remoto via ssh. Meu script abaixo funciona bem, mas eu gostaria de adicionar algum tipo de verificação para que, se algo desse errado ou quebrasse, o loop terminasse se o script começasse a fugir.

Como posso adicionar um componente que verifique se o loop foi executado, digamos 5 vezes em 3 segundos, então o script interromperia o loop e seria encerrado automaticamente?

#!/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: Eu tentei usar algo parecido tail -f, mas não pareceu funcionar quando outros programas esperam entrada em lotes. Todos os conselhos são bem-vindos.

pss: clipboardpipeé um pipe nomeado no diretório inicial do sistema remoto.

Responder1

GNU datetem precisão de nanossegundos via %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

Responder2

Se você estiver no Linux, poderá usar otempo esgotadocomando fornecido pelo pacote coreutils.

documentação de tempo limite

informação relacionada