Ankündigung

Einklappen
Keine Ankündigung bisher.

Beenden von EDOMI feststellen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Beenden von EDOMI feststellen

    Christian, ich hätte da noch mal eine Frage zum Beenden von EDOMI und wie sich ein EXEC Script dann geordnet beendet.

    Ich habe 2 EXEC LBS Skripte, welche per default in einem blockierenden Status sind und erst dann fortgesetzt werden, wenn über eine message queue eine Nachricht ankommt.
    Das Problem mit der Datenbank Connection war ja einfach zu lösen, indem man nach Empfang einer Nachricht ein sql_connect() macht. Funktioniert super.

    Ein anderes Problem ist nun, dass ich die message queue beim Beenden von EDOMI nicht ordnungsmäß löschen kann, da der EXEC Prozess ja im blockierten Modus ist, wenn keine Nachricht ankommt. Daher greift das while getSysInfo()>=1 nicht, sondern EDOMI beendet den Prozess irgendwann hart.

    Gibt es eine Lösung, wie ich im LBS Teil (EDOMI Logikschleife) mitbekommen kann, dass EDOMI gerade beendet wird? z.B. ein System-KO "System Shutdown". Das könnte ich auf einen Eingang des LBS legen und dann eine Message "Shutdown" an meinen EXEC Prozess senden. Dieser würde dann aufwachen, die while Schleife verlassen und die message queue ordnungsgemäß löschen.

    Macht ein solchen System-KO Sinn?
    Es müsste natürlich kurz vorher gesetzt werden, bevor EDOMI dann beendet wird. Ich denke es funktioniert derzeit ähnlich mit getSysInfo(). Und es müsste dann zeitlich noch gewährleistet sein, dass der LBS noch mal durchlaufen kann, um das Shutdown Signal an das EXEC Skript zu senden.

    Ohne eine solche Funktion, sammeln sich mit der Zeit (bis zum nächsten Reboot) viele leere Message Queues an.

    Aktives Warten im EXEC wäre natürlich eine Alternative, die mehr Ressourcen verbraucht, d.h. kein blockierendes Warten, sondern ständiges Durchlaufen der While Schleife mit einem usleep() am Ende.

    Außerdem wäre interessant zu wissen, wie EDOMI die EXEC Prozesse beendet? Wird zuerst ein SIGTERM gesendet und danach ggf. ein SIGKILL? Ggf. wäre dann auch eine Lösung im EXEC Skript einen Signal-Handler zu installieren, welcher das TERM Signal abfängt, die Message Queue löscht und sich dann beendet. SIGKILL kann man m.W. nicht abfangen.

    Wäre interessiert an Deiner Sicht? Vielleicht gibt es ja auch andere Ideen...

    #2
    Das SysKO[2] wird beim Beenden auf den Wert 2 gesetzt - dies ist jedoch nicht in der Hilfe dokumentiert, da dies normalerweise niemanden interessieren dürfte Allerdings bleiben Deinem LBS nur ca. 3 Sekunden, um entsprechend zu reagieren - denn dann wird die Logikengine quasi beendet und der LBS-Teil wird nicht mehr verarbeitet.

    Beendet werden alle Prozesse vom SH-Script per SIGKILL (9). Ein SIGTERM macht (ggf. mit Ausnahme der EXEC-LBS) keinen Sinn, da die EDOMI-Prozesse ohnehin nicht darauf reagieren würden. Die Prozessverwaltung findet EDOMI-intern statt - das harte Abschießen im SH-Script dient nur als Fallback, falls irgendwas schief gelaufen ist.

    Übrigens: Eine non-blocking-Verbindung braucht m.E. nicht wirklich mehr Ressourcen (kaum messbar). Das zyklische Abfragen des SysKOs braucht mit Sicherheit mehr, denn dies erfordert jedesmal einen DB-Zugriff. (ich weiß, das KO würde nicht zyklisch abgefragt werden, da blocking...)

    EDIT:
    Vergiss das SysKO[2] - ich habe gerade nochmal nachgeguckt: Es wird zwar =2 gesetzt, aber dann wird die Logikengine unmittelbar beendet. Nützt Dir also auch nicht wirklich etwas Von daher würde ich's non-blocking machen, dann hast Du die volle Kontrolle...

    Ich habe mir das aber mal notiert und mache mir Gedanken hierzu. Es wird vermutlich darauf hinauslaufen, dass man das SysKO[2] wie oben erläutert nutzen kann - schaun' wir mal...


    EDIT2:
    Aber wie willst Du ein "Shutdown" an Deinen EXEC senden bzw. auswerten, wenn dieser "geblocked" ist?! Oder anders gefragt: Wenn Du hierfür eine Lösung hast, kannst Du doch einfach wie üblich getSysInfo() verwenden...?
    Zuletzt geändert von gaert; 24.08.2016, 23:45.
    EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

    Kommentar


      #3
      Danke für die ausführliche Erklärung.

      Idee wäre gewesen, den LBS über das SysKO[2] zu triggern. Dieser sendet dann eine Message "Shutdown" an das EXEC Skript. Diese wird damit unblocked und beendet sich geordnet. Wenn das SysKO[2] 3s vor dem Beenden also auf 2 gesetzt würde und auch die EDOMI Logikschleife noch diese 3 Sekunden läuft und somit den LBS triggert, wäre das aus meiner Sicht ausreichend.

      Werde es aber auch mal non-blocking testen und den Unterschied in der Last messen. Insbesondere, wenn man viele Instanzen eines solchen LBS einsetzt wäre interessant zu wissen wie es sich auswirkt. Denn es würde ja in jedem Durchlauf eine DB Abfrage anfallen (getSysInfo()).




      Kommentar


        #4
        Mit getSysInfo() in jedem Durchlauf hast Du natürlich recht, aber das wäre akademisch - im Hintergrund werkelt eine in-memory-DB und auf einen DB-Zugriff mehr oder weniger kommt's letztlich auch nicht an (EDOMI macht schließlich reichlich Gebrauch davon) Natürlich wird das messbar sein, aber ob dies in der Realität "den Kohl fett macht"...?

        Aber wie gesagt: SysKO[2] werde ich mal überdenken - dauert aber noch ein bisschen, denn jetzt ist erstmal meine Visu/Logik dran
        EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

        Kommentar


          #5
          Okay. Das klingt gut. Danke!

          Kommentar


            #6
            Natürlich konnte ich nicht warten... Also: Demnächst wird das SysKO[2] beim Beenden/Neustart zunächst auf den Wert 2 gesetzt, anschließend wird 3 Sekunden gewartet und erst dann wird EDOMI tatsächlich beendet/neugestartet (das KO wird dann auf 3 gesetzt - aber das spielt dann auch keine Rolle mehr).

            Ein Neustart dauert also in Zukunft 3 Sekunden länger...
            EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

            Kommentar


              #7
              Danke Christian!

              Na hoffentlich verzeiht mir die EDOMI Gemeinde diese zusätzlichen Wartezeit.
              Beim Hardcore Edomi Jünger mit 10 Neustarts pro Tag macht das auf 10 Jahre immerhin ca. 30h zusätzliche Wartezeit.

              Kommentar


                #8
                Richtig

                Aber: Wenn EDOMI erstmal produktiv läuft und alles (Visu, etc.) fertig ist, sind Neustarts eigentlich nur noch im Falle eines Updates von Nöten. Insofern passt das dann schon...
                EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

                Kommentar


                  #9
                  Zitat von gaert Beitrag anzeigen
                  Richtig

                  Aber: Wenn EDOMI erstmal produktiv läuft und alles (Visu, etc.) fertig ist, sind Neustarts eigentlich nur noch im Falle eines Updates von Nöten. Insofern passt das dann schon...
                  Hmmm und wenn ich nicht will dass EDOMI "nur" produktiv läuft????
                  Ich dachte EDOMI ist dazu da, das ich damit "spielen" darf/ kann??
                  Hmmm hat mir keiner gesagt, dass EDOMI "nur" produktiv laufen soll......

                  Kommentar


                    #10
                    Du darfst machen was Du für richtig hältst

                    Ich vertraue EDOMI meine komplette Hütten-Installation an und werde (irgendwann) sicher nicht mehr 5 mal täglich irgendetwas testen und verändern. Und wenn's dann doch einmal so weit ist, muss ich eben 3 Sekunden länger warten
                    EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

                    Kommentar

                    Lädt...
                    X