Я пытаюсь получить пакеты ввода из удаленного канала через 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.