adminst
Goto Top

Powershell Prozess überwachen und evtl. neu starten

Hallo zusammen

Ich habe einen Dienst welcher per Batch gestartet wird und den MainWindowTitle "Prod 1-2 Socket" hat.
Der Dienst hört auf dem TCP Port 8250.

Aufgaben für das Powershell Script:
- TCP Port überwachen ob der Port 8250 auf ist
- wenn der Port nicht offen ist, sofern der Batch aber noch offen ist, diesen schliessen
- anschliessend das Batch Script c:\scripts\prod1-2.bat starten

Ich habe bis jetzt folgenden Code:

 

$System = New-Object Net.Sockets.TcpClient "10.20.18.14", 8251  

    if($System)
    {
        ""  
    }

     else
    {
        $r = get-process | select * | where{$_.MainWindowTitle -match "PROD 1 - 2"} | select Id  
        stop-process $r.Id
             
       # write-host $r.id
    }

Die Probleme sind folgende:
a) Wenn der Port nicht auf ist und er ein refused zurückbekommt geht er ins if und nicht ins else
b) Das Batchscript via Powershell starten

Danke für eure Hilfe
adminst

Content-ID: 269064

Url: https://administrator.de/forum/powershell-prozess-ueberwachen-und-evtl-neu-starten-269064.html

Ausgedruckt am: 03.04.2025 um 05:04 Uhr

colinardo
Lösung colinardo 14.04.2015 aktualisiert um 12:47:49 Uhr
Goto Top
Hallo adminst,
ich würde das mit Powershell so machen:
$listeningports = [System.Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties().GetActiveTcpListeners()
$port = $listeningports | ?{$_.Port -eq 8250}
if (!$port){
    write-host "There is no listener on Port 8250"  
    get-process * | ?{$_.MainWindowTitle -match "PROD 1 - 2"} | Stop-Process -Force  
    Start-Process "c:\scripts\prod1-2.bat"  
}
Ein ähnlich nützliches Script zum Thema findet man auch in diesem Thread:
Programm reagiert nicht - per Powershell neu starten?

Grüße Uwe
adminst
adminst 14.04.2015 um 13:13:02 Uhr
Goto Top
Hallo Colinardo
Du bist wie immer spitze!
Gibt es eine Möglichkeit beim Start-Process den MainwindowTitle mitzugeben.
Wenn ich so direkt das Batchfile starte, ist beim Prozess kein MainwindowTitle gesetzt.

Wenn das ganze händisch gestartet wird über ein Link, wird der Name vom Link als MainWindowTitle gesetzt.

Danke und Gruss
adminst
colinardo
Lösung colinardo 14.04.2015, aktualisiert am 27.04.2015 um 16:06:54 Uhr
Goto Top
Schreib in dein Batch-Script einfach ganz oben folgendes rein:
Title Das ist dein Fenstertitel
oder starte das Script hiermit in Powershell:
Start-Process "cmd" -Argumentlist '/c start "Dein Titel" c:\scripts\prod1-2.bat'
Grüße Uwe
adminst
adminst 27.04.2015 um 16:10:51 Uhr
Goto Top
Hallo Uwe
Wenn ich das ganze via netstat -ano | find "8250" erhalte ich auch die ID.
Wäre es möglich via netstat Variante zu lösen, dann würde es zuverlässig laufen?

Danke und Gruss
adminst
colinardo
Lösung colinardo 27.04.2015 aktualisiert um 16:49:43 Uhr
Goto Top
Naja ich würde das Script selber initial schon mit Powershell starten und überwachen dann hättest du schon die die ProcessID und das wäre eigentlich zielgerichteter.

Aber jeder wie er will.
$listeningports = [System.Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties().GetActiveTcpListeners()
$port = $listeningports | ?{$_.Port -eq 8250}
if (!$port){
    write-host "There is no listener on Port 8250"  
    $pid = netstat -ano | ?{$_ -match ".*?:8250"} | %{($_ -split '\s+')[5]} | select -First 1  
    if ($pid){
        get-process -id $pid | Stop-Process -Force
    }
    Start-Process "c:\scripts\prod1-2.bat"  
}
adminst
adminst 27.04.2015 um 16:51:19 Uhr
Goto Top
Hallo Uwe
Ich würde es auch lieber via Powershell starten etc. Leider sind wir da abhängig vom Softwarelieferanten, welcher im Hintergrund noch mit Java Sockets etc.
werkelt.

Danke für deinen sehr wertvollen Beitrag
adminst