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:
Grüße greenhorn101
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 161071
Url: https://administrator.de/forum/powershell-prozesse-ueberwachen-und-killen-161071.html
Ausgedruckt am: 16.02.2025 um 22:02 Uhr
3 Kommentare
Neuester Kommentar
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:
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
# -------
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
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