Endlosschleife funktioniert nicht mehr ab gewisser Zeit

  • Hallo allerseits,

    ich stehe mal wieder vor einem Phänomen, welches ich mir nicht erklären kann. Es geht um ein kleines Automatisierungsscript welches, bei einem vorhandenen VPN Zertifikat eine Verbindung hestellt und dann eine RDP Verbindung. Beim Abbau der RDP Verbindung wird die VPN Verbindung wieder gekappt. Dieses geschieht ganz simpel über eine Endlos Schleife die checkt ob das RDP Programm geöffnet ist. Nun funktioniert eigentlich super, aber nur wenn ich die Terminal Session unter 20 Minuten halte, sobald die Session über 20 Minuten ist, habe das jetzt oft genug getestet, kappt er die VPN Verbindung nicht mehr. Auch wenn dies jetzt keiner ausprobieren kann, ohne entsprechende VPN Zertifikat, vielleicht fällt ja doch kemanden etwas schlaues dazu ein;)

    Das Script sieht so aus:


    lg und schöne Woche noch

  • hmmm

    als Idee... lass in Deinem Script einen Timer mitlaufen... beende das Script nach... sagen wir 17 Minuten und starte es neu...

    Schau mal was dann passiert

    LG

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Ich kann nur raten was hier passiert... Hast du die Rückgabewerte und @errors von ProcessExists (hat kein @error) und RunWait (hat @error) mal abgefragt? Es wäre wichtig zu wissen an welcher Stelle das Problem auftritt.

    Außerdem würde ich erstmal ein While Sleep(100) aus dem While 1 machen, Computer sind auch nur Menschen, und wenn man dich 10.000x pro Sekunde fragt ob ein Prozess existiert geht dir das nach 20 Minuten vielleicht einfach auf den Zünder und du antwortest nicht mehr ^^

    M

  • Hi,

    nur mal für die Zukunft....bei solchen Scripten wenn man nicht weiß warum und wieso das Programm WAS macht, loggt man ALLES mit, und zwar jede Zeile!

    Dafür hat Scite im Reiter Extras die Funktion Trace: Add Trace Line um alle Zeilen mitzuloggen.

    Remove Trace Lines löscht dann diese Zeilen wieder.

    Weiterhin macht es ggf. Sinn nur die Funktionsaufrufe mitzuloggen, das macht man mit Trace:Add Func Trace Lines

    Einzelne Debug-ConsoleWrites() bekommt man, indem man den Cursor auf eine Variable stellt (oder etwas markiert) und dann ALT-D drückt.

    Debug-Messageboxen per CTRL_SHIFT-D

    Entgegen dem Rat von Mars würde ich den Sleep auf 1 oder 2 Sekunden hochsetzen, und mir den ProcessExist() zusammen mit einem Timestamp in der Konsole anzeigen lassen, ggf. zusammen mit der aktuellen Laufzeit der Schleife. Mit weniger als einer Sekunde "Wartezeit" kann ich zumindest die Konsolenausgabe nicht (richtig) mitlesen.

    sobald die Session über 20 Minuten ist, habe das jetzt oft genug getestet, kappt er die VPN Verbindung nicht mehr.

    Die große Frage ist, ob in der While-Schleife der ProcessExist()=0 nicht triggert oder der RunWait() nicht (richtig) ausgeführt wird.

    Das geht nur durch mitloggen/Debug-Lines!

  • okay, danke schonmal für den Input,

    also dass Computer auch nur menschen sind klingt schon mal intuitiv einleuchtend;) Ich werde erst mal mit der (100) versuchen, ich nehme an damit ist das Intervall erst ein mal herabgesetzt. Dann schaue ich was passiert. Wenns dann noch nicht gehr schaue ich mal wegen errorwert, bzw. wie ich da ran komme.


    lg und einen schönen Tag noch

  • Warum so minimalistisch? ;)

    Ist doch offensichtlich! Der so teuer angeschaffte Computer muss doch auch feste Arbeiten! Zwar nicht sinnvolles, aber das ist egal.....passt auch zu

    ich werde erst mal mit der (100) versuchen, ich nehme an damit ist das Intervall erst ein mal herabgesetzt. Dann schaue ich was passiert. Wenns dann noch nicht gehr schaue ich mal wegen errorwert, bzw. wie ich da ran komme.

    Anstatt zu debuggen und den Fehler zu finden, einfach noch einmal Stunden damit verbringen auf den Fehler zu warten....vielleicht tritt der ja wirklich nur alle x Milliarden Schleifendurchläufe auf...."Problem" gelöst :Face: Und wenn nach etlichen Minuten warten das Script immer noch nicht funktioniert, ist man genauso schlau wie vorher. Bei so einer Einstellung bin ich raus....


    ich nehme an damit ist das Intervall erst ein mal herabgesetzt.

    Übrigens hätte man das "früher" beim Betrieb eines 1- oder 2-Kernprozessors sofort gemerkt bzw. im Taskmanager gesehen wenn der Rechner in einer "ungebremsten" Dauerschleife das System am Anschlag laufen lässt. Heutzutage bei einem 12-Kernprozessor sieht man im Taskmanager NICHTS (bzw. nur 8% CPU-Last), weil Windows den amoklaufenden AutoIt-Thread so schnell zwischen den Cores wechselt, dass man schon genau hinsehen muss. Das Problem sind nicht die "nur" 8% CPU-Last sondern das von Windows deswegen exzessiv durchgeführte Core-hopping, welches das gesamte System verlangsamt. Daher ist das IMMER eine gute Idee ->

    Selbst ein Abfrageintervall von 10 Sekunden würde doch deinen Anforderungen gerecht werden.

  • Nicht an jeder Starssenecke stehen HigH End Rechner!

    Daher macht es schon Sinn ein Überwachungsprogramm schlafen zu legen wenn man es nicht braucht. Da bin ich voll bei BugFix.

    Fehler suchen? Ja klar immer! Nur mancher Fehler läßt sich weder finden noch eingrenzen! Da hat man dann die Wahl, hauptsache es läuft - oder man weiß es genauer.

    Ein Szenario das mit zuvielen Anfragen zusammenhängt ist durchaus denkbar (Ich hoffe ich finde die richtigen Worte um meinen Ansatz zu beschreiben).

    Stellen wir uns in den Tiefen des Systems/Programms irgendwo eine Variable vor, die eine Größenbegrenzung hat.... wenn wir nun die Anzahl der Abfragen um 50% veringern, läuft diese Variable 50% später voll...

    Also ein Fehler der durch zuviele Wiederholungen entsteht.....???!!!

    Sleep nach oben und beobachen ist also auch eine Art von Fehlersuche...

    LG

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • ich würde die PID die in $cmd als Rückgabe des Aufrufs "Run" zurückgegeben wird auf ProcessExist prüfen.

    Nicht dass da ein weiteres mstsc aufgrufen wird und dann gibt es 2. Dann kann die Schleife auch nicht breaken. ;)

    setze Zeile 60:

    Code
    IF ProcessExists ( $cmd ) .......

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

    Einmal editiert, zuletzt von Schnuffel (12. April 2023 um 18:16)