Prozesse die sich aufgehängt haben, beenden/killen

  • Hi!

    Also hab schon in die Abteilung "ohne Gegenleistung" gepostet. Benötige dieses Script jedoch dringend.

    Und zwar benötige ich ein Script, dass automatisch überprüft ob ein bestimmtes geöffnetes Programm (Prozess) ganz normal läuft oder eben gerade mit "Keine Rückmeldung" dasteht (also komplett einfriert). Und wenn es dann eben eingefroren ist, beendet das script automatisch diesen prozess.

    Hab in der Arbeit nämlich ein Programm laufen, dass sich nach bestimmter Zeit immer aufhängt. Derzeit hab ichs so gelöst, dass er das Programm alle 2 Stunden beendet. Aber ist ja auch nicht wirklich von Vorteil.

    Also ich würde sogar dafür zahlen wenn mir das jemand schreibt, danke.

    Mfg

    EDIT: Kann das vielleicht mit WinExists funtkionieren?

    ALso ungefähr so:

    While 1

    If WinExists("Name des Fensters") ---> [Aber wie find ich den genauen Namen des Fensters heraus wenn der keine rückmeldung hat, also mit genauen ABständen usw?] Then
    WinActivate("Name des Fensters")
    Sleep(2000)
    ProcessClose oder WinKill
    Endif
    Wend

    Also starten tut es dann wieder autmatisch, das brauch ich im script nicht drinnen. Also nur das es es beendet.
    Hmm gibt es nen Befehl mit dem ich den Fensternamen ausgeben kann? Dann mach ich das nämlich einfach mit dem Befehl irgendwie?

    Naja hoffentlich schreibt bald jemand etwas und hilft mir. Danke.

    Mfg

    EDIT: Ok hab nun WinGetTitleRetrives the full title from a window. gefunden. Also so les ich mir den titel aus und versuch dann mit winexists, winactivate und winkill hoffentlich das fenster schließen ;)
    Bin nicht daheim deswegen kann ichs nicht testen. werds daheim aber mal ausprobieren. hoffe trotzdem, dass mir vl irgendwer helfen kann oder mir tipps geben kann.

    2 Mal editiert, zuletzt von Poksi (1. Dezember 2011 um 10:03)

  • Ich würde das folgendermaßen versuchen:

    Alle x minuten/sekunden:
    Mit WinList eine Liste aller Fenster erhalten
    Für jedes Fenster: Enthält der Titel (StringInStr) den String "Keine Rückmeldung"? Wenn ja, WinKill.

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

  • hmm hört sich besser an als meine lösung ;)

    könntest du da etwas zusammenschreiben wenn möglich?
    ALso würde dann jede Minute mit WinList eine Liste der Fenster erhalten (was meinst du mit erhalten?). Liest der das aus und schreibts wo rein oder bleibt das im hintergrund. und dann einfach mit if - Then Befehl den String abfragen und WinKill ausführen?

    ALso einfach eine Schleife mit Sleep60000 in die das erstellt wird.

    mfg

    EDIT: Hmm versteh das nicht ganz mit winlist, und kanns leider nicht mal testen in der arbeit daweil. kanns erst ab 18 uhr daheim ausprobieren.

    EDIT: So hatte gestern leider keine Zeit mehr das zu testen, jedoch werde ich heute Abend mal testen und einen Bericht hier reinschreiben wie es gelaufen ist. Hoffe das funktioniert so wie ich es mir vorgestellt habe.

    So habe nun etwas gefunden im autoitforum:

    [autoit]

    If _NotResponding("TITLE HERE", "TEXT HERE[OPTIONAL]", 1) Then; The last parameter indicates whether you want to close the hung app or not. MsgBox(0, "", "Hung Application, closing app now.") Else MsgBox(0, "", "Application running as intended.") EndIf 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 ;==>_NotResponding

    [/autoit]

    aber ich würde noch gern etwas verändern mit eurer hilfe.
    was muss bei TITLE HERE geschrieben werden? der normale titel oder wenn er bereits hängt?
    und ich würde gern alle 2 minuten überprüfen lassen ob es hängt und eben winactivate alle 2 minuten wenn winexists, damit keine rückmeldung auch wirklich dasteht wenn es hängt.

    hoffe ihr könnt mir helfen.

    mfg

    2 Mal editiert, zuletzt von Poksi (2. Dezember 2011 um 14:31)

  • Hallo nochmals!

    Hab mir jetzt ne viel kleiners Script geschrieben, was hoffentlich das macht was ich will. Testen tu ich es gerade, aber muss warten bis Fenster sich aufhängt.

    [autoit]

    While Sleep(6000)
    If WinExists("TITLE normal") Then
    WinActivate("TITLE normal")
    ElseIf
    WinExists("TITLE wenn er hängt") Then
    WinKill("TITLE wenn er hängt")
    EndIf
    WEnd

    [/autoit]
  • Wirklich einfach:
    Ich würde alle x Minuten folgenden cmd-Befehl ausführen:

    Code
    taskkill /f /fi "status eq not responding"


    Zum Beispiel so (oder ähnlich):

    [autoit]

    $File = FileOpen(@ScriptDir & '\killtask.bat', 2)
    FileWrite($File, 'taskkill /f /fi "status eq not responding"')
    FileClose($File)

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

    While Sleep(30000)
    RunWait(@ScriptDir & '\killtask.bat', @SystemDir, @SW_HIDE)
    WEnd

    [/autoit]

    MfG, James C.

  • Naja funtkioniert das auch wenn das Fenster nicht Keine Rückmeldung hat. Also ich mein ich muss das Fenster ab und zu aktivieren damit es überhaupt als Keine Rückmeldung dasteht.

    ALso dieser Batchbefehl beendet Fenster die hängengeblieben sind? Kannte ich gar nicht ;)

    Naja werds auf jeden Fall versuchen.

    Danke

  • Damit wird jeder Prozess beendet der nicht reagiert, unabhängig vom Fenster.

    Edit:
    Eine andere Möglichkeit wäre so etwas wie

    Code
    @ECHO OFF
    :LOOP
    taskkill /f /fi "status eq not responding"
    GOTO LOOP

    Dann brauchst du AutoIt gar nicht mehr.

  • Habs mir mit AutoIt geschrieben und funktioniert daweil. Meines ging irgendwie nicht, denke er hat den Namen des Fensters nicht richtig erkannt. Hat ihn zwar aktiviert, aber beendet wurde das Fenster dann nicht.

    Mit deinen hat er das Fenster sofort beendet. Perfekt, klein aber fein. Für mich genau das was ich brauchte. Ich danke Dir.

    Mal schauen, ich lass es jetzt laufen und hoffe dass, das Programm sich gleich nochmals aufhängt um es im laufenden Betrieb zu testen.