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-Key: 269064

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

Printed on: April 25, 2024 at 03:04 o'clock

Member: colinardo
Solution colinardo Apr 14, 2015 updated at 10:47:49 (UTC)
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
Member: adminst
adminst Apr 14, 2015 at 11:13:02 (UTC)
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
Member: colinardo
Solution colinardo Apr 14, 2015, updated at Apr 27, 2015 at 14:06:54 (UTC)
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
Member: adminst
adminst Apr 27, 2015 at 14:10:51 (UTC)
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
Member: colinardo
Solution colinardo Apr 27, 2015 updated at 14:49:43 (UTC)
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"  
}
Member: adminst
adminst Apr 27, 2015 at 14:51:19 (UTC)
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