[vz-users] vzlogger exec maximal 32 Zeilen
Andreas Brus
abrus.de at gmail.com
Mi Jan 12 09:51:37 CET 2022
Moin,
seit Jahren lese ich mit, habe mich aber schon lange nicht mehr
beteiligt. U.a. weil die technische Hürde zu hoch war meine Adresse
googlemail ->gmail zu ändern, damit ich wieder schreiben darf. Die
uralten Links (mailman) von damals zum Ändern funktionierten nicht etc.
Aber jetzt habe ich es geschafft. Sorry an den Admin für die Fehlversuche.
meine Herausforderung: Ich habe mir ein PHP-Script geschrieben, das die
Daten meiner Fritzbox-Aktoren ausgibt.
Das funktionierte seit Jahren mit dem Exec-Meter problemlos. Nun habe
ich festgestellt, daß einige Werte in letzter Zeit immer wieder nicht
richtig eingelesen wurden.
Nach einiger Sucherei bin ich auf die Ursache gestoßen: Der Exec-Meter
oder womöglich alle Meter? können nur 32 Werte auf einmal verarbeiten.
Da mit der Zeit immer mehr Geräte dazu kamen sind es nun eben >40 Werte
und je nach Reihenfolge der Ausgabe werden eben nur die ersten 32 davon
verarbeitet.
Aus dem vzlogger:
src/protocols/MeterExec.cpp
Das wird in der Funktion MeterExec::read gleich zweimal sichergestellt:
while (i < n && !feof(_pipe)) {
while (i < n && fgets(buffer, 256, _pipe)) {
Ich nehme an, daß n irgendwo hardcoded auf 32 steht.
Allerdings wenn man die Abfrage auf i < n wegnimmt und so nur prüft, ob
noch was in der pipe steht oder fgets Daten bekommt, kann man zwar bis
zu zwei weitere Werte (laut debug log) lesen, aber dann stürzt der
komplette Prozess ab. Ich nehme also an, daß es dann an anderer Stelle
zu einem Überlauf kommt.
Leider bin ich kein cpp-Profi bzw. habe auch keine passende IDE um dem
schnell auf die Schliche kommen zu können.
Ich habe als Workaround jetzt alle Temperaturen und alle Leistungsdaten
in einen separaten MeterExec gepackt und bekomme jetzt wenigstens wieder
alle Werte eingelesen. Dafür muss ich aber zweimal kurz hintereinander
die Fritzbox abrufen und das scheint die auch nicht immer so toll zu
finden, d.h. manchmal gibt es beim zweiten Aufruf einen Timeout.
Nun die Frage an die Profis:
1.) ist die Begrenzung auf 32 so tief im System, daß es schwierig wird
diese Grenze z.B. zu verdoppeln?
2.) gibt es eine bessere Möglichkeit?
2a) Früher konnte der ExecMeter auch Logfiles mehr oder weniger
kontinuierlich lesen, wenn ich mich richtig erinnere. Im Code habe ich
dazu aber nichts gesehen. Es wird aktuell ein Command ausgeführt und die
Ausgabe als pipe eingelesen.
Die Parameter rewind bzw: "we will try to listen on changes with
inotify" scheint es nicht mehr zu geben?
Oder welches Protocol müsste man dafür nehmen?
Falls das gehen würde könnte ich natürlich prinzipiell die Abfrage per
cron machen, in ein Logfile schreiben und vzlogger wartet halt bis neue
Zeilen ins Logfile geschrieben werden. Wobei es mir schon gut gefallen
hat nur einen Prozess prüfen und überwachen zu müssen, statt dann cron,
Logfile und vzlogger und ausserdem dafür sorgen daß das Logfile nicht zu
groß wird.
Grüße aus Tübingen
Andreas Brus
Mehr Informationen über die Mailingliste volkszaehler-users