Wie kann ich die Beendigung einer Bash-Schleife erzwingen, wenn sie in x Sekunden x-mal ausgeführt wird?

Wie kann ich die Beendigung einer Bash-Schleife erzwingen, wenn sie in x Sekunden x-mal ausgeführt wird?

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: clipboardpipeist eine benannte Pipe im Home-Verzeichnis auf dem Remote-System.

Antwort1

GNU dateverfü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.

Timeout-Dokumentation

verwandte Informationen