Überwachen eines Prozesses und rebooten des Rechners zu einer bestimmten Zeit

  • Hallo,

    bin in Sachen Autoit noch nicht ganz fit. Ich habe folgendes vor:

    Ein Prozess (im Beispiel Outlook) soll überwacht werden ob er noch läuft, tut er das nicht soll er wieder gestartet werden.
    Zudem soll einmal am Tag das System rebootet werden.

    Sicherlich kann ich das über einen geplanten Task machen, will ich aus einem bestimmten Grund nicht.

    Mein Problem:

    Er betrachtet immer nur den ersten "Case", jenachdem welche Zeile unter dem Select steht wird dann bearbeitet. Hat hier Jemand einen Tip warum das so ist ? Ich dachte wenn Case 1 nicht eintrifft, wird Case 2 bearbeitet. Oder betrachte ich das Ganze falsch ?

    [autoit]

    while 1
    Select
    Case _outlook() = ProcessWaitClose("outlook.exe") ; wenn outlook abstürzt wieder starten
    Case _Time() = "10:00:00" ; wenn es 10 Uhr ist soll der Rechner rebootet werden
    _reboot()
    EndSelect
    sleep(50)
    WEnd

    Func _Time()
    return @hour & ":" & @min & ":" & @sec
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func _reboot()
    Shutdown(6)
    EndFunc ;==> Rechner reboot

    [/autoit][autoit][/autoit][autoit]

    Func _outlook()
    Run("C:\Programme\Microsoft Office\OFFICE11\OUTLOOK.EXE")
    EndFunc; ==> Outlook wieder starten

    [/autoit]

    Bin für jeden Tip dankbar.

  • außredem ist dein script nach dem reboot nichtmehr aktiv. Das heißt du mussst den in den Autostart packen.

  • Das Script läuft sogar als Shell ... Ich starte eine Mediacenteroberfläche als Shell, und diese überwache ich ob sie noch läuft, bzw. soll das Scritp dieses erledigen.

    Das mit dem CaseContinue funkt aber leider nicht ?(

  • Oder muss ich das anders angehen ? Also nicht als Case sondern als IF ?

    Es soll ja folgendes passieren im Beispiel:

    Wenn Outlook sich aufhängt, dann soll es neugestartet werden UND wenn eine Uhrzeit eintrifft soll rebootet werden. Er soll also zwei Sachen überwachen: ob ein bestimmter Prozess noch läuft und diesen gegebenenfalls wieder starten und wenn eine eingestellte Zeit eintrifft soll er rebooten. Ist da die Case Methode evtl. die falsche angehensweise ?

    • Offizieller Beitrag

    ContinueCase funktioniert schon:

    Spoiler anzeigen
    [autoit]

    Global $a = 1, $b = 1, $c = 'ende'
    Select
    Case $a = 1
    MsgBox(0, '', '$a = ' & $a)
    ContinueCase
    Case $b = 1
    MsgBox(0, '', '$b = ' & $b)
    ContinueCase
    Case Else
    MsgBox(0, '', '$c = ' & $c)
    EndSelect

    [/autoit]

    Aber du stellst ja die Bedingung, dass Outlook abstürzt und erst dann die nächste Case-Abfrage erfolgen kann:
    ProcessWaitClose
    Pauses script execution until a given process does not exist.

    Besser so:

    [autoit]

    Select
    Case Not ProcessExists("outlook.exe")
    Run("C:\Programme\Microsoft Office\OFFICE11\OUTLOOK.EXE")
    ContinueCase
    Case _Time() = "10:00:00" ; wenn es 10 Uhr ist soll der Rechner rebootet werden
    _reboot()
    EndSelect

    [/autoit]
  • Vielen Dank für deine Hilfe ! Das bringt mich schon auf den richtigen Weg. Im jetzigen Beispiel habe ich mal Notepad dazu genommen, statt Reboot.

    Wenn Outlook schon läuft wenn ich das Script starte ist alles soweit ok. Rennt Outlook noch nicht, ich starte das Script, wird Outlook gestartet ABER Notepad wird auch 1 mal gestartet obwohl die eingestellte Zeit noch nicht eingetroffen ist (was ja sonst nen reboot bedeutet).

    Ansonsten startet er Notpad wenn Outlook schon läuft 8 mal, wie kann das sein ?

    [autoit]


    while 1
    Select
    Case Not ProcessExists("outlook.exe")
    Run("C:\Programme\Microsoft Office\OFFICE11\OUTLOOK.EXE")
    ContinueCase
    Case _Time() = "12:32:00" ; wenn es 10 Uhr ist soll der Rechner rebootet werden
    _starten()

    EndSelect
    sleep(50)
    WEnd

    Func _Time()
    return @hour & ":" & @min & ":" & @sec
    EndFunc ;==>_Time

    [/autoit][autoit][/autoit][autoit]

    Func _starten()
    ;Shutdown(6)
    run("c:\windows\system32\notepad.exe")
    EndFunc ;==>_starten

    [/autoit][autoit][/autoit][autoit]

    Func _outlook()
    Run("C:\Programme\Microsoft Office\OFFICE11\OUTLOOK.EXE")
    EndFunc

    [/autoit]
  • 1) Das ContinueCase überspringt die Abfrage

    Zitat

    continue a case into the next case in a Select or Switch block.


    = Einen Case IMnächsten Case fortsetzen

    2) Du hast ein Sleep(50)
    -> Du fragst aber nur auf die Sekunde genau ab. Dann startet er jedes Mal, wenn er i9n der Sekunde die Schleife macht. Daher z.B. den Wochentag abfragen und Variable setzen.

    Spoiler anzeigen
    [autoit]


    Global $LastStartedWDAY = -1
    while 1
    Select
    Case Not ProcessExists("outlook.exe")
    Run("C:\Programme\Microsoft Office\OFFICE11\OUTLOOK.EXE")
    ; ContinueCase
    Case _Time() = "12:32:00" And @WDAY <> $LastStartedWDAY ; Wenn es 12.32:00 ist und es am heutigen Wochentag noch nicht ausgeführt wurde


    ; wenn es 10 Uhr ist soll der Rechner rebootet werden
    _starten()

    EndSelect
    sleep(50)
    WEnd

    Func _Time()
    return @hour & ":" & @min & ":" & @sec
    EndFunc ;==>_Time

    [/autoit] [autoit][/autoit] [autoit]

    Func _starten()
    ;Shutdown(6)
    run("c:\windows\system32\notepad.exe")
    $LastStartedWDAY = @WDAY
    EndFunc ;==>_starten

    [/autoit] [autoit][/autoit] [autoit]

    Func _outlook()
    Run("C:\Programme\Microsoft Office\OFFICE11\OUTLOOK.EXE")
    EndFunc

    [/autoit]
  • Wahnsinn ! Vielen Dank, genau das ist es. Jetzt muss ich mir mal den Code in Ruhe reinziehen damit ich das auch selber nachvollziehen kann, man will ja dazu lernen :thumbup:

    Danke an alle Helfer !

    • Offizieller Beitrag

    Also ich hab gerade zu diesem Thema eine Diskussion im EN-Forum nachgelesen.
    Wie es aussieht, weiß niemand ganau, welchen Sinn das ContinueCase hat.
    So, wie in der Hilfe beschrieben (Abort the current case and continue a case into the next case in a Select or Switch block.) funktioniert es definitiv nicht.
    Denn dort steht ...beendet den aktuellen Case und setzt beim nächsten Case fort...
    Das bedeutet in meiner Lesweise, dass auch die Überprüfung der Case-Anweisung durchgeführt wird. Und eben dieses passiert nicht.
    Hab jetzt mehrfach probiert, dies ist die Arbeitsweise von ContinueCase:
    Ab dem Moment, wo eine Bedingung TRUE ist, werden alle weiteren per ContinueCase verknüpften Bedingungen ebenfalls als TRUE angesehen!!

    Welchen Sinn macht das dann??

    Also bleibt nur auf If-Then-Else-Statements zurückzugreifen innerhalb des ContinueCase.

  • Nun das ContinueCase wird wohl das Gegenstück zur break; -anweisung bei c(++) sein. Dort muss man das immer einfügen, wenn nicht in den nächste Case gesprungen werden soll und Autoit macht das eben genau andersrum.

    • Offizieller Beitrag

    Hallo,

    wenn man sich das Beispiel von ContinueCase anschaut sollte es eigentlich deutlich sein was der Befehl macht, er überspringt quasi die nächste Case-Zeile und arbeitet den Code in der Case-Anweisung ab.

    • Offizieller Beitrag

    Ja OK, aber welchen Sinn hat diese Konstruktion?
    Ich finde adhoc nur eine sinnvolle Verwendung: Abarbeiten von Fehlerroutinen von großem Fehlerwert abwärts, wobei alle kleineren Routinen jeweils in der größeren enthalten sein müssen.
    Viel sinnvoller erscheint eigentlich das Fortsetzen der Case-Abfragen MIT Bedingungsprüfung.
    Aber der Weg bleibt verschlossen :( - Ein klares 'No Way' von Valik in dieser Richtung.

  • Hä? Ich habe jetzt diese Diskussion verfolgt, aber entweder das liegt am neuen AutoIt, oder ich hab was falsch verstanden, denn wenn ich diesen Code ausführe kommt immer das richtige Ergebnis:

    [autoit]

    If Not StringIsDigit($NU) Then
    Select
    Case StringIsDigit($XC) = 0
    $FM &= $XC & @CRLF
    ContinueCase
    Case StringIsDigit($MC) = 0
    $FM &= $MC & @CRLF
    ContinueCase
    Case StringIsDigit($HC) = 0
    $FM &= $HC & @CRLF
    EndSelect
    MsgBox(16, "Fehler", $FM)
    EndIf

    [/autoit]
    Die Werte entstehen so
    [autoit]


    Dim $FM = ""
    $XC = IniRead(@ScriptDir&"\test.ini", "ACK", "XC", "Der Wert XC in der INI wurde auf eine nicht gültige Weise verändert!")
    $MC = IniRead(@ScriptDir&"\test.ini", "ACK", "MA", "Der Wert MA in der INI wurde auf eine nicht gültige Weise verändert!")
    $HC = IniRead(@ScriptDir&"\test.ini", "ACK", "HA", "Der Wert HA in der INI wurde auf eine nicht gültige Weise verändert!")
    $NU = $XC&$MC&$HC&

    [/autoit]


    Der Inhalt der INI(Natürlich nur der Ausschnitt):
    [ACK]
    XC=630
    MA=610
    HA=630
    AA=650


    Bei mir kommt da ganz normal keine ErrorMsg, ändere ich die Werte jedoch, so das auch Buchstaben vorhanden sind, oder lösche ich diese bekomme ich die richtige Fehlernachricht.
    Edit: Beim testen der Codeschnipsel ist mir aufgefallen das die Methode den Inhalt des Schlüssels und nicht den Defalt vom IniRead liefert, wenn man etwas austauscht. Peinlich peinlich... ;) :D :rolleyes:

    Projekte: Keine größeren (und fertigen)
    Gegen Internetzensur:
    https://epetitionen.bundestag.de/index.php?acti…s;petition=3860
    (Zeichnungsfrist abgelaufen)
    __________________________________________________________________________________________________________________________________
    Dieser Beitrag wurde bereits 264 mal editiert, zuletzt von »Fast2« (30. Februar 2009, 12:99)

  • Kann man mit AutoIT auch realisieren das man den Rechner aus dem Standby weckt ? Also wenn der Rechner im Standby ist und die Rebootzeit wäre Nachts fällig das er den Rechner auch weckt.

    Geht das ? Oder muss ich da auf ein anderes Tool zugreifen ? Einen geplanten Task würde ich ungern machen.

  • Ich sehe gerade, wenn der Process sich komplett abschießt wird neugestartet, was ja auch ok ist. Wenn der Process hängt also im Taskmanager steht dann zum Beispiel neben notepad.exe (Keine Rückmeldung) ... dann wird ja nicht neu gestartet, weil der Process ja noch quasi rennt.

    Gibt es da eine Funktion die das überwacht ?

    • Offizieller Beitrag
    [autoit]

    Func _NotResponding($title, $text, $closeIfHung = 0)
    $hWnd = WinGetHandle($title, $text)
    If $hWnd == "" Then
    MsgBox(0,"Error","Could not find window")
    Exit
    EndIf
    $retArr = DllCall("user32.dll", "int", "IsHungAppWindow", "hwnd", $hWnd)
    If @error == 0 Then
    If $retArr[0] == 1 Then
    If $closeIfHung Then
    ProcessClose(WinGetProcess($title, $text))
    EndIf
    Return 1
    EndIf
    Else
    Return 0
    EndIf
    EndFunc

    [/autoit]
  • Man kann ja wirklich vieles machen mit AutoIT. Was mir aber gerade auffällt ist der Speicherverbrauch. Das Script was ich zusammengestellt habe nimmt sich ca. 7MB ram (script ca. 300KB als exe) ist das normal ? Oder kann ich da noch optimieren (evtl. mit dem CleanScript).