Como posso forçar um loop bash a terminar se ele for executado x vezes em x segundos?

3

Eu estou tentando pegar lotes de entrada de um pipe remoto via ssh. Meu script abaixo funciona ok, mas eu gostaria de adicionar algum tipo de verificação para que, se algo desse errado ou quebrasse, o loop terminaria se o script começasse a funcionar.

Como posso adicionar um componente que verificaria se o loop era executado, digamos 5 vezes em 3 segundos, então o script interromperia o loop e terminaria 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 tinha olhado para usar algo como tail -f , mas não parecia funcionar quando outros programas esperavam entradas em lotes. Todo conselho é bem vindo.

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

    
por cwd 30.03.2012 / 04:50

2 respostas

2

O GNU date tem uma 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
    
por 30.03.2012 / 07:38
2

Se você estiver no Linux, você pode usar o comando timeout que é fornecido pelo pacote coreutils.

documentação de tempo limite

    
por 30.03.2012 / 09:34