Ich habe versucht, ein Skript zu schreiben, um zu überprüfen, dass alle Statistiken einer Metriken positiv sind, bevor ich weitere Änderungen mit dem Dienst vornehmen. Der Teil I an bin stecken denkt über, wie man Schwanz die Rekursion für den folgenden Anwendungsfall:Tail Rekursion in Bash
function load_cache() {
cacheStat=($(curl -s -X GET "http://localhost:${MET_PORT}/metrics" | sed 's/\\\\\//\//g' | sed 's/[{}]//g' | awk -v k="cacheSize" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}' | sed 's/\"\:\"/\|/g' | sed 's/[\,]/ /g' | sed 's/\"//g' | grep -w "cacheSize" | cut -d ':' -f 2))
# the above gives me the ouput(cacheStat) as -
# 2.0
# 311.0
# 102.0
count=0
for index in ${!cacheStat[*]}
do
if [[ ${cacheStat[$index]} -le 0 ] && [ $count -lt 3 ]]; then
sleep .5
count=$[$count +1];
load_cache
#Wouldn't the above initialise `count` to 0 again.
fi
done
}
Was ich versuche zu tun ist, wenn eine der Elemente in den cacheStat kleiner oder gleich 0
, dann schlafen für .5
Sekunden und Abfrage der CacheStat erneut und führen Sie die Überprüfung für alle seine Elemente erneut. Obwohl nicht mehr als 3 Mal, für die ich versuche zu zählen.
Offen für jeden Vorschlag, um das Skript zu verbessern.
aktualisieren - Auf die Skripte modifizieren, wie durch @Inian vorgeschlagen
RETRY_COUNT=0
function load_cache() {
cacheStat=($(curl -s -X GET "http://localhost:${MET_PORT}/metrics" | sed 's/\\\\\//\//g' | sed 's/[{}]//g' | awk -v k="cacheSize" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}' | sed 's/\"\:\"/\|/g' | sed 's/[\,]/ /g' | sed 's/\"//g' | grep -w "cacheSize" | cut -d ':' -f 2));
for index in ${!cacheStat[*]}
do
echo "Stat - ${cacheStat[$index]}"
if ((${cacheStat[$index]} <= 0)) && (($RETRY_COUNT < 3)); then
echo "Attempt count - ${RETRY_COUNT}"
sleep .5s
RETRY_COUNT=$((RETRY_COUNT +1));
load_cache
fi
done
}
Die Protokolle lesen -
> > + cacheStat=($(curl -s -X GET "http://localhost:${MET_PORT}/metrics" | sed 's/\\\\\//\//g' | sed
> 's/[{}]//g' | awk -v k="cacheSize"
> > '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}' | sed
> > 's/\"\:\"/\|/g' | sed 's/[\,]/ /g' | sed 's/\"//g' | grep -w
> > "cacheSize" | cut -d ':' -f 2))
> > ++ curl -s -X GET http://localhost:8181/metrics
> > ++ sed 's/\\\\\//\//g'
> > ++ sed 's/[{}]//g'
> > ++ sed 's/[\,]/ /g'
> > ++ awk -v k=cacheSize '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}'
> > ++ sed 's/\"\:\"/\|/g'
> > ++ cut -d : -f 2
> > ++ sed 's/\"//g'
> > ++ grep -w cacheSize
Es ist nicht einmal iterieren Ich denke, .
Ihr Skript hat einige Syntaxprobleme. Repariere es, bevor du es zurückprobierst. Bist du sicher, dass das funktioniert hat? – Inian
@Inian Es hat nicht. Deshalb teilen Sie es. Und könnten Sie bitte auf die Fehler hinweisen? Betrachten Sie mich als Neuling, um zu bash.Wenn ich versuche, das Skript auszuführen, sehe ich nur "count = 0" und nichts voraus. Auch wenn ich da ein "Echo" setze. – nullpointer
Verweisen Sie meine Antwort unten, entfernen Sie in erster Linie unendliche Rekursion, indem Sie 'count' außerhalb der Funktion bewegen. – Inian