Ich versuche, Eingabestapel von einer Remote-Pipe über SSH abzurufen. Mein unten stehendes Skript funktioniert einwandfrei, aber ich möchte eine Art Prüfung darin einbauen, sodass die Schleife beendet wird, wenn etwas schiefgeht oder unterbrochen wird, wenn das Skript außer Kontrolle gerät.
Wie kann ich eine Komponente hinzufügen, die prüft, ob die Schleife beispielsweise fünfmal in drei Sekunden ausgeführt wurde, sodass das Skript die Schleife unterbricht und automatisch beendet?
#!/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: Ich habe mir die Verwendung von etwas Ähnlichem angesehen tail -f
, aber es schien nicht zu funktionieren, wenn andere Programme Eingaben in Stapeln erwarten. Jeder Rat ist willkommen.
pss: clipboardpipe
ist eine benannte Pipe im Home-Verzeichnis auf dem Remote-System.
Antwort1
GNU date
verfügt über eine Nanosekundenpräzision über %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
Antwort2
Wenn Sie Linux verwenden, können Sie denAuszeitBefehl, der vom Coreutils-Paket bereitgestellt wird.