none
Windows Ereignis-Logs durchsuchen und Dienst neustarten RRS feed

  • Frage

  • Hallo Leute,

    ich habe das Problem auf einem Windows Server 2012 R2 dass mir ein wichtiger Dienst immer abstürzt. Die Ursache ist mir auch schon bekannt aber es dauert noch eine Weile bis das behoben werden kann. Deswegen dachte ich mir ob man das nicht mit einem PowerShell übergangsweise lösen kann. 

    Ich möchte quasi ein Script schreiben welches mir einen bestimmten Eintrag in den Ereignislogs sucht und wenn etwas gefunden wird soll ein Dienst neugestartet werden. Es sollen nur die Einträge der letzten 5 Minuten durchsucht werden. Dann stelle ich das im Aufgabenplaner so ein dass es alle 5 Minuten mal läuft.

    Habe zuletzt was vor 8 Jahren mit PowerShell gemacht und schon komplett alles vergessen. Würde mich freuen wenn mir da jmd behilflich sein könnte.

    Unter Windows-Protokolle->Anwendung

    Ereignis:

    Ebene: Fehler

    Quelle: TiWebServer

    Allgemein: "Handlerequest error…"

    Grüße


    • Bearbeitet Lea55 Freitag, 10. Mai 2019 07:13
    Freitag, 10. Mai 2019 07:07

Antworten

  • Hallo,

    der Code wuerde dir Treffer anzeigen, die es innerhalb der letzen 5 Minuten gab >(Get-Date).AddMinutes(- 5)< , wenn es in dem Zeitraum keine Treffer gab wird auch nix gelistet.

    Du kannst dann mit der Zahl spielen, also z.B.: aus der 5 die 60 machen, dann wuerde er von der aktuellen Zeit eine Stunde in die Vergangenheit suchen.

    Wenn dir aber die Eventloganzeige im Computermanagement einen Treffer im Suchzeitraum zeigt, kann es nur an den Suchkriterien liegen, nennt sich die Quelle z.B.: wirklich genau TiWebServer?

    # weiche suchen
    $_.Source -like '*TiWebServer*'
    übers Knie gebrochen


    $Ergebnis = Get-EventLog -LogName Application | 
        Where-Object {($_.Source -like '*TiWebServer*') -and ($_.Message -like '*Handlerequest error*') -and ($_.TimeGenerated -gt (Get-Date).AddMinutes(- 5))}
    if ($Ergebnis) {
        Restart-Service -Name DeinDienst -Force
    }
    Den Namen deines Dienstes kann du mit Get-Service ermitteln, 2. Spalte.


    Beste Gruesse
    brima




    • Bearbeitet brima Freitag, 10. Mai 2019 12:36
    • Als Antwort markiert Lea55 Montag, 13. Mai 2019 11:18
    Freitag, 10. Mai 2019 12:05
  • Womit wir wieder bei den Grundlagen sind, die man lernen sollte, wenn man mit einem Produkt arbeiten will.

    $_.Source -eq '*TiWebServer*')

    Das ist Unsinn da muss dann schon ein -like hin, damit die Wildcards "wirken". (s.o.)

    PS U:\> $a = "Test"
    PS U:\> $a -like '*test*'
    True
    PS U:\> $a -eq '*test*'
    False

    Ich kenne deinen Dienst nicht, ich kenne deine Eventlog nicht, ich kann nur mit den Infos arbeiten die Du hier postest.

    Get-EventLog -LogName Application | Select-object *

    Damit kannst Du dir die Log im Detail gesamt ansehen und somit einen Eintrag genau analysieren um zu sehen wie du filtern musst um nur noch diese Eintraege zu finden.

    Get-Service -Name DienstName | Select-Object *

    Damit kannst Du dir den Diesnt genauer ansehen und feststellen ob man ihn beenden neustarten usw darf, siehe die CAN* Attribute,

    Beste Gruesse
    brima

    • Als Antwort markiert Lea55 Montag, 13. Mai 2019 11:18
    Montag, 13. Mai 2019 10:51

Alle Antworten

  • Hallo Lea55 und Willkommen im Deutschen Powershell Forum.

    Wir sind Dir gern behilflich, aber wir können keinen gebrauchsfertigen Code auf Anfrage liefern. Du wirst also selbst aktiv werden müssen. Wenn Du bereits Code geschrieben hast, mit dem Du Probleme hast oder der nciht tut, was Du erwartest, kannst Du den hier posten (als Code formatiert, bitte) und wir werden nach Kräften versuchen, Dir zu helfen. Es kann auch nicht schaden, mal in der PowershellGallery vorbeizuschauen ... man muss das Rad ja nicht zwingend neu erfinden.


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Freitag, 10. Mai 2019 07:34
  • Hallo,

    also suchen nach den Einträgen muesste so funktionieren.

    Get-EventLog -LogName Application | Where-Object {($_.Source -eq 'TiWebServer') -and ($_.Message -like '*Handlerequest error*') -and ($_.TimeGenerated -gt (Get-Date).AddMinutes(- 5))}

    Zum starten des betreffenden Service bittet sich >Start-Service< an.

    Beste Gruesse

    brima

    Freitag, 10. Mai 2019 07:47
  • Hallo BOfH_666,

    ich wollte keinen komplett fertigen Code sondern nur ein Grundgerüst auf dem ich dann aktiv werden kann. Ich wüsste selber überhaupt nicht wie ich da anfangen soll, deswegen hab ich hier um Hilfe gebeten.

    Freitag, 10. Mai 2019 07:47
  • also suchen nach den Einträgen muesste so funktionieren.

    ... müsste? ... na ob das bei Dir funktioniert, kannst ja nur Du beurteilen? Hast Du's getestet? Es ist empfehlenswert, in den Code an erlaubten Stellen einen Zeilenumbruch einzufügen - das erhöht die Lesbarkeit enorm. ... zum Beispiel nach einem Pipe-Symbol.

    Wenn der Service NEU gestartet werden soll, kommst Du mit Start-Service vermutlich nichtweiter. Wenn ein Service bereits läuft, hat Start-Service keinen Effekt.


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Freitag, 10. Mai 2019 07:53
  • Alternativ kannst du ja auch Get-Service regelmäßig aufrufen um zu prüfen, ob der Dienst noch läuft um ihn dann neu zu starten:
    https://www.windowspro.de/script/get-service-windows-dienste-anzeigen-powershell

    Wenn du das Eventlog prüfst, musst du sowieso erst feststellen, ob die Meldung nicht schon älter ist und der Dienst schon wieder gestartet wurde.

    Freitag, 10. Mai 2019 07:56
  • Hallo bfuerchau,

    das hatte ich mir anfangs auch gedacht dass man die Ereignisanzeige garnicht braucht. Das Problem ist aber dass nach dem Crash des Dienstes dieser immer noch auf "Wird ausgeführt" steht. Deswegen hatte sich das wieder erledigt. Kann es aber sein dass sich nur die Anzeige nicht richtig aktualisiert, im Hintergrund er aber schon beendet ist?

    Freitag, 10. Mai 2019 08:05
  • Hallo Olaf,

    was soll das jetzt?

    Also ich habe das gerade auf einem iPdad 'trocken' geschrieben, dort kann ich das leider nicht testen. :-)

    Start-Service war nur ein Hinweis, ich hätte auch schreiben können. "sieh dir die *-Service CmdLETs an.

    Und hast Du nicht vor mir geschrieben, dass wir hier keinen fertigen Code liefern? Denn den hätte ich fuer das Problem vorliegen!?

    Beste Gruesse
    brima

    Freitag, 10. Mai 2019 08:15
  • was soll das jetzt?

    Oooops ... sorry ... ich hatte gar nicht auf den "Absender" geschaut ...  ich hatte im Hinterkopf, dass diese Antwort von Lea55 war ... Entschuldige bitte.

    Also Lea55 ...  jetzt hast Du erstmal was zum Testen.  ;-) :-D

    Und hast Du nicht vor mir geschrieben, dass wir hier keinen fertigen Code liefern? Denn den hätte ich fuer das Problem vorliegen!?

    Wenn Du den rausrücken willst und es Lea einfach machen möchtest, werde ich Dich nicht abhalten ... ;-)


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    • Bearbeitet BOfH-666 Freitag, 10. Mai 2019 08:26
    Freitag, 10. Mai 2019 08:24
  • Alles ist gut Olaf. :-)

    Noe, fertigen Code raus ruecken bringt nichts, das verhindert den Willen zu erzeugen, es selbst zu lernen.

    Und es ist doch immer ein schoenes Gefuehl, wenn man ein Problem selbst, aber auch mit Hilfe von Anderen loest. Viel besser, wie einfach nur Copy& Paste, und dann noch ein paar Namen anzupassen.

    Und wie man im Thread hier schon sieht gibt es auch hier verschiedene Ansaetze
    - soll der Service nur am leben erhalten werden
    - sollen Abbrueche, Haenger, usw. an Hand von Protokollen dokumentiert werden ..
    - sollen diese unterschiedlich behandelt werden
    - ...

    Beste Gruesse
    brima


    • Bearbeitet brima Freitag, 10. Mai 2019 08:56
    Freitag, 10. Mai 2019 08:29
  • Kann es aber sein ...

    Um sicher zu sein, solltest Du es testen.

    Wie schon gesagt - wenn der Dienst läuft und neu gestartet werden soll, musst Du entweder Restart-Service benutzen oder den Dienst erst mit Stop-Service anhalten und dann mit Start-Service wieder starten. Start-Service macht bei einem bereits gestarteten Service genau gar nix. ;-)


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Freitag, 10. Mai 2019 08:43
  • Danke für Eure Hilfe Leute.

    Wenn ich den Code so wie ihn brima geschickt hat ausführe, macht er paar Sekunden irgendwas und hört dann auf. Es gibt keinerlei Ausgabe ob er was gefunden hat oder nicht. Habe mal probiert mit "> test.log" am Ende des Codes eine Ausgabe in eine Datei zu schreiben. Die bleibt aber leider leer.

    Wie Ihr seht hab ich leider kaum Ahnung davon. Ich weiss Eure Gutmütigkeit mir was beizubringen sehr zu schätzen aber vllt könnt Ihr das nochmal überdenken und mir einen fertigen Code zuschicken :D

    Ich werde PowerShell höchstwahrscheinlich wieder in 8 Jahren benutzen und bis dahin hab ich es sowieso wieder vergessen, also macht es nicht viel Sinn wenn ich dabei was lerne :)

    Ich will quasi nur dass dieser Dienst am Leben erhalten wird. An seinem Status wird man nicht erkennen ob es gecrasht ist oder nicht, deswegen meine ich dass man über die Ereignisanzeige gehen muss. Wenn dieser Eintrag in den letzten 5 Minuten vorhanden ist, soll der Dienst einfach neugestartet werden.

    Freitag, 10. Mai 2019 11:14
  • Hallo,

    der Code wuerde dir Treffer anzeigen, die es innerhalb der letzen 5 Minuten gab >(Get-Date).AddMinutes(- 5)< , wenn es in dem Zeitraum keine Treffer gab wird auch nix gelistet.

    Du kannst dann mit der Zahl spielen, also z.B.: aus der 5 die 60 machen, dann wuerde er von der aktuellen Zeit eine Stunde in die Vergangenheit suchen.

    Wenn dir aber die Eventloganzeige im Computermanagement einen Treffer im Suchzeitraum zeigt, kann es nur an den Suchkriterien liegen, nennt sich die Quelle z.B.: wirklich genau TiWebServer?

    # weiche suchen
    $_.Source -like '*TiWebServer*'
    übers Knie gebrochen


    $Ergebnis = Get-EventLog -LogName Application | 
        Where-Object {($_.Source -like '*TiWebServer*') -and ($_.Message -like '*Handlerequest error*') -and ($_.TimeGenerated -gt (Get-Date).AddMinutes(- 5))}
    if ($Ergebnis) {
        Restart-Service -Name DeinDienst -Force
    }
    Den Namen deines Dienstes kann du mit Get-Service ermitteln, 2. Spalte.


    Beste Gruesse
    brima




    • Bearbeitet brima Freitag, 10. Mai 2019 12:36
    • Als Antwort markiert Lea55 Montag, 13. Mai 2019 11:18
    Freitag, 10. Mai 2019 12:05
  • Hallo zusammen,


    irgendwie werd ich nicht schlau aus dem Code.


    Das war mein erster Gedanke dass der womöglich nix findet, deswegen habe ich Einträge genommen die in den letzten 5 Minuten tatsächlich vorhanden waren.


    Mit Echo $Ergebnis hab ich versucht eine Ausgabe zu bekommen zum testen -> Kein Ergebnis
    Erst als ich das

    ($_.Source -eq '*TiWebServer*')

    rausnahm, bekam ich ein Ergebnis. Habe auch versucht andere Quellen anzugeben wie z.b. '*Engine*' was sehr oft vorkommt. Auch kein Ergebnis. Also irgendwas passt nicht mit dieser Zeile.


    Auch mit dem $_.Message -like ... passt irgendwas nicht. Gibt es da eine Begrenzung für die Anzahl Zeichen die durchsucht werden sollen oder so? In dem Message-Text sind mehrere Sätze vorhanden. Suche ich nach begriffen im ersten Satz, bekomm ich ein Ergebnis. Nach dem ersten Punkt, also quasi ab dem 2. Satz findet er keine Begriffe mehr...


    Nun gut, ich habe es jetzt so gebogen dass ich ein Ergebnis habe damit ich testen kann ob der Dienst neugestartet wird. Geht leider auch nicht. Folgende Fehlermeldung mit der ich nix anfangen kann:

    Restart-Service : Der Dienst "Ti Webserver (TiWebserver)" kann aufgrund des folgenden Fehlers nicht 
    beendet werden: Der Dienst TiWebserver kann nicht auf dem Computer . geöffnet werden.
    In C:\Users\TiServ\Desktop\test.ps1:4 Zeichen:5
    +     Restart-Service -Name TiWebserver -Force
    +     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : CloseError: (System.ServiceProcess.ServiceController:ServiceController) [Restart-Service 
       ], ServiceCommandException
        + FullyQualifiedErrorId : CouldNotStopService,Microsoft.PowerShell.Commands.RestartServiceCommand



    • Bearbeitet Lea55 Montag, 13. Mai 2019 08:24
    Montag, 13. Mai 2019 08:23
  • Womit wir wieder bei den Grundlagen sind, die man lernen sollte, wenn man mit einem Produkt arbeiten will.

    $_.Source -eq '*TiWebServer*')

    Das ist Unsinn da muss dann schon ein -like hin, damit die Wildcards "wirken". (s.o.)

    PS U:\> $a = "Test"
    PS U:\> $a -like '*test*'
    True
    PS U:\> $a -eq '*test*'
    False

    Ich kenne deinen Dienst nicht, ich kenne deine Eventlog nicht, ich kann nur mit den Infos arbeiten die Du hier postest.

    Get-EventLog -LogName Application | Select-object *

    Damit kannst Du dir die Log im Detail gesamt ansehen und somit einen Eintrag genau analysieren um zu sehen wie du filtern musst um nur noch diese Eintraege zu finden.

    Get-Service -Name DienstName | Select-Object *

    Damit kannst Du dir den Diesnt genauer ansehen und feststellen ob man ihn beenden neustarten usw darf, siehe die CAN* Attribute,

    Beste Gruesse
    brima

    • Als Antwort markiert Lea55 Montag, 13. Mai 2019 11:18
    Montag, 13. Mai 2019 10:51
  • ok also wenn man Wildcards nutzt, muss man "like" nutzen, genau wie im SQL eigentlich, hätte ich auch selber draufkommen können.

    Und die Fehlermeldung kam weil ich PowerShell nicht als Administrator ausgeführt habe.

    Jetzt funktioniert alles so wie ich wollte.

    Vielen herzlichen Dank!!

    Montag, 13. Mai 2019 11:18