[Shell Script Spezi gesucht] Sync Loss Counter Shell Script funktioniert nicht

edgecrusher

Mitglied
Mitglied seit
4 Mai 2008
Beiträge
303
Punkte für Reaktionen
4
Punkte
18
Moin,

mal ne Frage. Ich suche einen absoluten Loss of Sync Zähler in der Fritz!Box. Absolut, weil "<? query sar:status/StatResync ?>" nur ein Array ausgibt mit den Anzahl der Synclosses auf Zeit (mit relativer Verzögerung). Aber irgend woher muss diese SSI ja auch die Werte bekommen. Egal ob showdslstat Binary oder dsl_info oder aus dem /proc/ FS. Kann mir einer exakt sagen wo genau die FB diesen Wert bunkert?

Gruß
Edge

EDIT:

lässt sich dafür <? query sar:status/ds_los ?> (im Sinne von Syncloss von/durch das CO) und <? query sar:status/us_los ?> (im Sinne von Syncloss von/durch das CPE) misbrauchen?
 
Zuletzt bearbeitet:
So, bis jetzt hab ich keinen "einfachen" Counter gefunden wo man eine absolute Zahl findet. Hab also versucht für die Ausgabe von StatResync (was ja nur 24h abdeckt) ein Shell Script zu schreiben

z.B. meine aktuelle Ausgabe davo
Code:
# ctlmgr_ctl r sar status/StatResync
2,0,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
#

Was ich erreichen will ist, dass das Shell Script die Werte anhand des Kommas splittet und als Einzelwerte registriert sowie am Ende alle Einzelwerte aufsummiert, so dass die Gesamtzahl für 24h Stunden steht

Ich habs auf Gedei und Verderb nicht hinbekommen (mangels Erfahrung im Shell Scripting) und habe zur Zeit folgende Konstruktion lauffähig bekommen

Code:
#! /bin/sh

 


counter=1
LOSCNT=0

while [ $counter -le 24 ]

do
        VALUE=`ctlmgr_ctl r sar status/StatResync | cut -f$counter -d,`
        LOSCNT=`expr $LOSCNT + $VALUE`
        counter=`expr $counter + 1`
done

echo $LOSCNT

Ergebnis ist korrekt

Code:
# ./test
5
#

Das hat allerdings zur Folge, da jedes Mal der SSI (ctlmgr_ctl r sar status/StatResync) aufgerufen wird, dass es unheimlich lange dauert, bis die Summe steht.

Kann sich ein Shell Script Spezi das mal angucken? Ziel war es von mir, das die Werte einmal ausgelesen werden und in eine Variable geschrieben werden und dann die Zählschleife diese Werte aus der Variable auseinander nimmt (splittet) und aufsummiert und dann die Summe auszugeben

Gruß
Edge
 
Hi, versuch mal ob das hinhaut, ich hab grad keine Möglichkeit es zu testen:


Code:
data=`ctlmgr_ctl r sar status/StatResync`

counter=1
LOSCNT=0

while [ $counter -le 24 ]

do

	 VALUE=`echo $data | awk -F "," '{print $'$counter'}'`
        LOSCNT=`expr $LOSCNT + $VALUE`
        counter=`expr $counter + 1`
done

echo $LOSCNT
 
Zuletzt bearbeitet:
Hey,

erstmal vielen Dank für die Antwort. Werd ich auf jeden Fall testen. Aktuell hatte ichs nochmal komplett geändert, aktuell nutze ich (funktionierend). Deines sieht aber noch kompakter (und, ich hab keine Ahnung vom effektiven Shell Skripten, effektiver aus)

Code:
ctlmgr_ctl r sar status/StatResync > /var/tmp/syncloss.txt
BASEVALUES=/var/tmp/syncloss.txt
CNT=1
LoS_CNT=0

while [ $CNT -le 24 ]
do
        SINGLEVALUE=`cat $BASEVALUES | cut -f$CNT -d,`
        LoS_CNT=`expr $LoS_CNT + $SINGLEVALUE`
        CNT=`expr $CNT + 1`
done

rm $BASEVALUES

Die Ausgabe erfolgt mittlerweile in einem anderen Script, nur falls du dich wunderst, warum bei mir das Ergebnis nicht mehr ge echoed wird.

Gruß
Edge
 
Zuletzt bearbeitet:
Hi!

Du kannst bei deinem letzten Script die Ausgabe von ctlmgr_ctl r sar status/StatResync direkt in eine Variable schreiben lassen, dann sparst du dir den Umweg über die temporäre Datei.

Code:
BASEVALUES=`ctlmgr_ctl r sar status/StatResync`
CNT=1
LoS_CNT=0

while [ $CNT -le 24 ]
do
        SINGLEVALUE=`echo $BASEVALUES | cut -f$CNT -d,`
        LoS_CNT=`expr $LoS_CNT + $SINGLEVALUE`
        CNT=`expr $CNT + 1`
done
 
So sollte es auch funktionieren:
Code:
BASEVALUES=$(ctlmgr_ctl r sar status/StatResync)
CNT=1
LoS_CNT=0

while [ $CNT -le 24 ]; do
        SINGLEVALUE=$(echo $BASEVALUES | cut -f$CNT -d,)
        LoS_CNT=$(expr $LoS_CNT + $SINGLEVALUE)
        CNT=$(($CNT + 1))
done
 
oder auch so
Code:
sum() {
  local IFS=, counter=0 value
  for value in $1; do
    : $((counter += value))
  done
  echo $counter
}
sum $(ctlmgr_ctl r sar status/StatResync)
 
Die Lösung aus Beitrag Nr. 7 ist wohl die eleganteste :)

Zum testen:
Code:
sum() {
        local IFS=, counter=0 value
        for value in $1; do
                : $((counter += value))
        done
        echo $counter
}

#sum $(ctlmgr_ctl r sar status/StatResync)
sum "2,0,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"

Ausgabe:
Code:
# ./test.sh 
5
#
 
Zuletzt bearbeitet:

Zurzeit aktive Besucher

Statistik des Forums

Themen
246,361
Beiträge
2,250,846
Mitglieder
374,014
Neuestes Mitglied
flindiesel
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.