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 date
tem 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.