greenhorn101
Goto Top

PowerShell Prozesse überwachen und killen

Hallo liebes Forum,

ich will auf einem Server Prozesse überwachen, damit ich ein anderes PowerShell Skript ausführen kann.
Das Problem ist, dass gewisse Prozesse hängen bleiben (auch der Task Scheduler mit dem ich das andere Skript ausführen will).
Wie man gewisse Prozesse stoppt weiß ich, aber wie kann ich das Skript so schreiben dass es erst schaut welche Prozesse laufen und welche davon hängen?
Dann eben nur diese killed die hängen??

Ich denke eine Schleife wäre am Sinnvollsten.

Prozesse beenden:

Get-Process | Where-Object { $_.name -eq "iexplore" } | Foreach-Object { $_.Kill() }  



Grüße greenhorn101

Content-Key: 161071

Url: https://administrator.de/contentid/161071

Printed on: April 24, 2024 at 08:04 o'clock

Member: H41mSh1C0R
H41mSh1C0R Feb 18, 2011 at 10:53:13 (UTC)
Goto Top
Get-Process * | where {$_.responding -like "False"} | stop-process  

Hier werden alle Prozesse Beendet die keine Rückmeldung liefern.

vg
Member: thl1966
thl1966 Sep 04, 2012 at 06:44:24 (UTC)
Goto Top
Hallo liebe Forengemeinde,

möchte auch Prozess am Server überwachen.

Wie man den hängenden Prozess ermittelt und beendet ist mir bekannt.

Manchmal hängt ein Prozess eine bestimmte Zeit und läuft dann weiter.
Dieser Prozess soll aber dann weiterlaufen.

Wenn der Prozess sagen wir >5 min. hängt, dann erst soll der Prozess beendet werden.
Habe mir erst mal damit beholfen, eine bestimmte Zeitspanne zu warten und dann erneut den hängenden Prozess abzufragen.
Aber in der Zeitspanne, kann der Prozesszustand von Not Responding wieder auf Normalzustand sein und evtl. dann wieder kurz hängen. Nach dieser Zeitspanne kille ich dann den Prozess.

Den Prozess wird um 23 Uhr auf jeden Fall beendet.

Wie kann ich das eleganter realisieren?

Vieleicht hat jemand einen fertigen Code.

Hier mein Code:

# ----------
# Funktionen
# ----------


Function Prozess_beenden($Prozessname)
{
  get-process | where-object {$_.name -eq $Prozessname} | Foreach-Object {$_.kill()}  
} # Ende Funktion Prozess_beenden



Function Datum_Uhrzeit_ermitteln()
{
  $Datum = (Get-Date).ToShortDateString()
  $Wochentag = Get-Date $Datum -Format dddd
  $Zeit = (Get-Date).ToShortTimeString()
  # Write-Host "Zeit aktuell" + $Zeit 
  
} # Ende Function Datum_Uhrzeit_ermitteln()



# -------------------------------------
# Variablen Deklarieren-/Initialisieren
# -------------------------------------

  $Datum = (Get-Date).ToShortDateString() # Datum in Variable $Datum und in String umwandeln
  $Zeit = (Get-Date).ToShortTimeString() # Zeit herausziehen und in einen String umwandeln
  $Stunden = $Zeit.substring(0,2) # Nur die Stunden extrahieren
  $Minuten = $Zeit.substring(3,2) # Nur die Minuten extrahieren
  $Tag = $Datum.substring(0,2) # Nur Tag extrahieren
  $Monat = $Datum.substring(3,2) # Nur Monat extrahieren
  $Jahr = $Datum.substring(6,4) # Nur Jahr extrahieren
  $Wochentag = Get-Date $Datum -Format dddd

  $AbsturzZaehler=0
  $AbsturzZeit = 0
  $Prozess = "Druckerspooler" # Prozess,der überwacht werden und ggfls. beendet werden soll (Ohne die Erweiterung .exe eingeben!)  
  $ProzessEnde = "23:00"  
  $U = 0 # Zähler der auf 0 bleiben soll, da die Schleife nicht abbrechen darf!


# ------------------
# Bildschirm löschen
# ------------------

  Clear-Host

# ----------------------------------------
# Meldung vor Start des Programms ausgeben
# -----------------------------------------

  Write-Host "Prozess: " $Prozess " wird um " $ProzessEnde " Uhr beendet! sowie hängende Prozess auch"  


# Endlos-Schleife


do {
    do {

        # Aktuelle Uhrzeit ermitteln
        $Datum = (Get-Date).ToShortDateString()
        $Wochentag = Get-Date $Datum -Format dddd
        $Zeit = (Get-Date).ToShortTimeString()
        # ---------------------------------------
        
                
        # Prozess wird um 23:00 Uhr beendet, auch wenn der Prozess nicht abgestürzt ist
        if ($Zeit -eq $Prozessende) { Prozess_beenden($Prozess) }
        } while ($Haengender_Prozessname.Processname -ne $Prozess) # Druchlaufen, solange bis kein Dienst hängt!    
        # ------------------------------------------------------------------------------------------------------

        # Ab hier Befehle ausführen, da der Prozess hängen geblieben ist

        # 5 Minuten warten
        wait-event -timeout 300
        # ---------------------

        # Aktuelle Uhrzeit auf dem Bildschirm ausgeben
          $Zeit
        # --------------------------------------------
        
        # Hinweiß-Meldung ausgeben
                
        write-host "Der Prozess: " $Prozess " scheint länger als 5 Minuten zu hängen!" -foregroundcolor red -backgroundcolor yellow  
        Write-Host "Beende den Prozess: " $Prozess " auf dem Amotiq-Server" -foregroundcolor red -backgroundcolor yellow  
        Write-Host $Prozess + "wird von WatchDog neu gestartet.... keine Aktion im Skript erforderlich!"  
        Write-Host ""     
        
        # Wenn jetzt der Prozess noch hängt, dann Prozess beenden
          Prozess_beenden($Prozess)
        # -------------------------------------------------------
        
        # ----------------------------------
        # Anzahl der Abstürze protokollieren
        # ----------------------------------
                  
        $AbsturzZaehler = $AbsturzZaehler +1
        Write-Host "Absturz Nummer: " $AbsturzZaehler  
        Write-Host ""  

        # -------------------------------------------------------------------------------------------------------------------------------------
        # Aktuelles Datum mit Wochentag und Uhrzeit holen, sonst wäre das Datum-/Uhr immer die, als die erste Do-While-Schleife verlassen wurde
        # -------------------------------------------------------------------------------------------------------------------------------------
     
        Datum_Uhrzeit_ermitteln

        # -----------------------------------------
        # Datum mit Wochzentag und Uhrzeit anzeigen
        # -----------------------------------------
           
        Get-Date

        # ----------------------------------------
        # Nachricht für den Mailversand definieren
        # ----------------------------------------

        $Betreff = "Prozess: " + $Prozess + " hängt am Produktiv-Server und wurde neu gestartet!"  
        $Nachricht = "Prozess: " + $Prozess + " hängt am Produktiv-Server und wurde neu gestartet! -> Datum: " + $Zeit  

        # Aktuelle Uhrzeit ermitteln
        $Datum = (Get-Date).ToShortDateString()
        $Wochentag = Get-Date $Datum -Format dddd
        $Zeit = (Get-Date).ToShortTimeString()
        # ---------------------------------------

        
        # Prozess wird um 23:00 Uhr beendet
        if ($Zeit -eq $ProzessEnde) { Prozess_beenden($Prozess) }
        # ------------------------------------------------
    
} Until ($U -ne 0) # Da $U nie verändert wird, läuft die Schleife unendlich, da $U immer 0 und nicht <> ist!



# ----------------------
# Ende Powershell-Skript
# -------
Member: thl1966
thl1966 Sep 05, 2012 at 06:45:30 (UTC)
Goto Top
Möchte aber den Prozess erst beenden, wenn die Rückmeldung min. eine bestimmte Zeitspanne z.b. 10 min. ist.

D.h. hängt der Prozess z.b. 10 Min. lang, dann erst Prozess beenden.

Hintergrund ist der, dass auf dem Server ein wichtigter Produktionsprozess läuft, der einmal pro Woche abstürzt.
Dann soll der Prozess beendet werden. Über das Programm Watchdog wird dann dieser Prozess neu gestartet.

Wenn z.B. der Prozess, weil er gerade ausgelastet ist ca. 2-4 Min. "hängt" bzw. Not Responding bekommt, dann soll er natürlich weiterlaufen. Erst nachdem der Prozess länger als die Zeitspanne nicht mehr reagiert, dann soll der Prozess beendet werden.

Das mit dem Druckerspooler war nur ein Test-Skript.

Gruß

Thomas