[gelöst] select error in FHEM main loop

Begonnen von zap, 20 Februar 2017, 12:26:14

Vorheriges Thema - Nächstes Thema

zap

Hallo,

ich starte in einem Modul mit Hilfe von SubProcess.pm einen weiteren Prozess. Dabei wird ein Socket-Paar für die Kommunikation zwischen Childprocess und FHEM angelegt.
Danach trage ich den Filedescriptor in $hash->{FD} ein und mache einen Eintrag $selectlist{"$name.$pid"}, also mit meinem Devicename (hier "d_rpc") und einer ProzessID).
Die Kommunikation funktioniert danach wie erwartet, d.h. die Funktion _Read() wird aufgerufen und ich kann Daten auslesen.

Wenn ich jetzt den Childprocess beende, kommen von FHEM direkt nach der Beendigung die folgenden Meldungen (die Einträge mit HMCCURPC am Anfang sind vom Childprocess):

2017.02.20 11:56:57 2: HMCCURPC: Process finished
2017.02.20 11:56:57 1: ERROR: Select error -1 (9), error count= 0
2017.02.20 11:56:57 1: Found and deleted bad fileno for TCM_ESP3_2./dev/ttyUSB1
2017.02.20 11:56:57 1: /dev/ttyACM0 disconnected, waiting to reappear (d_cul433)
2017.02.20 11:56:57 1: ERROR: Select error -1 (9), error count= 0
2017.02.20 11:56:57 1: Found and deleted bad fileno for telnetPort_127.0.0.1_52976
2017.02.20 11:57:00 3: d_cul433: Possible commands: BbCFiAZNkGMKUYRTVWXefmLltux
2017.02.20 11:57:00 1: /dev/ttyACM0 reappeared (d_cul433)

Irgendwie scheint also die selectlist bzw. die FDs der Geräte durcheinander gekommen zu sein.
FHEM läuft weiter. Die beiden Devices, auf die sich die Select-Errors beziehen, haben nichts mit meinem Modul zu tun (es handelt sich um ein EnOcean Stick und ein 433 MHz CUL).

UPDATE: Die Fehlermeldung kommt nur für die beiden per USB angebundenen Sticks für EnOcean und CUL_433. Wenn ich den Childprocess erneut starte, nachdem FHEM die beiden Devices aus der selectlist geworfen hat, kommt der Fehler nicht mehr. Sehr seltsam.

UPDATE 22.2.2017
Ursache war, dass ich beim Start die SubProcess Objekte in einem Hash gespeichert habe. Diesen Hash habe ich nach Beendigung der SubProzesse gelöscht. Das war eine schlechte Idee, die zu dem oben beschriebenen Verhalten geführt hat. Perl scheint hier noch irgendwelche Referenzen gespeichert zu haben, auch wenn die Objekte eigentlich nicht mehr benutzt werden.

2xCCU3, Fenster, Rollläden, Themostate, Stromzähler, Steckdosen ...)
Entwicklung: FHEM auf AMD NUC (Ubuntu)
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: FULLY, Meteohub, HMCCU, AndroidDB

Dr. Boris Neubert

Hallo,

aus der Erinnerung heraus gibt es Punkte, die beim Duplizieren von Filehandles in Kindprozesse zu beachten sind. Auf perldoc gab es dazu eine ganze Litanei. Habe es aber auf Anhieb nicht gefunden.  Das nur als Hinweis, um die Suche in eine mögliche Richtung zu lenken.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

zap

Danke! Ich denke das geht in die richtige Richtung, da ich tatsächlich Filehandles dupliziere.
2xCCU3, Fenster, Rollläden, Themostate, Stromzähler, Steckdosen ...)
Entwicklung: FHEM auf AMD NUC (Ubuntu)
Produktiv inzwischen auf Home Assistant gewechselt.
Maintainer: FULLY, Meteohub, HMCCU, AndroidDB

dominik

Hallo,

ich benutze die selectlist um Daten vom Chromecast (98_CHROMECAST.pm) zu empfangen. Sobald der Chromecast nicht mehr verfügbar ist, erhalte ich die Fehlermeldung:
https://github.com/mhop/fhem-mirror/blob/master/fhem/fhem.pl#L655

Gibt es eine Möglichkeit, dass ich diesen Fehler vorab abfange und damit im Device erfahre, dass es nicht mehr erreichbar ist? Denke da an einen Aufruf von z.B. X_ConnectionError?

Gruß
Dominik
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik

rudolfkoenig

Falls man sich in selectlist eingetragen hat, und die andere Seite die Verbindung zumacht, dann wird ReadFn aufgerufen, wo man typischerweise sysread aufruft, der undef zurueckliefert. Daraufhin sollte man close()/etc aufrufen, aber auch selectlist pflegen. Sowas wird einem von den DevIo_* Routinen abgenommen.

Btw. das hier ist eine lupenreine Thread-Entfuehrung, und das ist nicht nett.

dominik

Danke dir für die rasche Antwort!

Ich wollte keinen neuen Thread aufmachen wenn es dazu schon etwas gibt. Aber ok, verstanden, war nicht exakt das gleiche Problem. Beim nächsten Mal erstelle ich einen neuen Thread.

Gruß
Dominik
fhempy -  https://github.com/fhempy/fhempy: GoogleCast, Tuya, UPnP, Ring, EQ3BT, Nespresso, Xiaomi, Spotify, Object Detection, ...
Kaffeespende: https://paypal.me/todominik