sinzal
Goto Top

Anhand Anwendungsnamen prüfen, ob Anwendung gestartet ist

Hallo Admins,

ich habe einen Win Server 2012 R2, auf dem ich ein Java-Programm laufen habe, dass öfters abstürzt. Bisher wurde es manuell wieder gestartet, aber dies nervt mit der Zeit. Ich möchte eine Batch (ggf. auch ein Programm mit Borland Delphi) schreiben, die in regelmäßigen Abständen durch die Aufgabenverwaltung gestartet werden kann und nachschaut, ob mein Java-Programm noch aktiv ist. Dabei kann ich NICHT nach der Prozess-Bezeichnung suchen, da diese (wie andere PRozesse auf dem Server auch) nur java.exe heißt. ICh muss über die Bezeichnung der Anwendung "Mein Programm" (ja, mit Leerzeichen dazwischen) gehen. Sollte die Anwendung nicht aktiv sein, muss die Batch sie erneut starten. Sollte sie aktiv sein, soll durch die Batch nix geschehen.
Habt Ihr einen Vorschlag, wie man das realisieren kann?

Viele Grüße,
Sinzal

Content-Key: 299289

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

Printed on: April 23, 2024 at 09:04 o'clock

Member: MrCount
MrCount Mar 16, 2016 at 15:45:11 (UTC)
Goto Top
Hi Sinzal,

sofern dein Programm ein eigenes Fenster hat, kannst du nach danach suchen lassen:

Beispiel
Member: SaschaRD
SaschaRD Mar 16, 2016 at 17:44:48 (UTC)
Goto Top
Hallo Sinzal,

die Suche und Powershell helfen, Administrator.de.

Gruß, Sascha
Member: Sinzal
Sinzal Mar 17, 2016 at 09:27:26 (UTC)
Goto Top
Vielen Dank erstmal für die Antworten.

@MrCount: Ich versuche mich mal in den Quelltext einzulesen und so ein Programm zu erstellen. Bis jetzt habe ich es noch nicht geschafft.

@Sascha: Ich habe deine Variante ausprobiert und $Program = "MEINPROGRAMMNAME" durch $Program = "Mein Programm" ersetzt. Leider gibt mir Powershell einen Fehler aus:
„Es kann kein Prozess mit dem Namen „Mein Programm“ gefunden werden.“
Kann es sein, dass das Skript den Prozessnamen und nicht den Anwendungsnamen überprüft? Im Taskmanager heißt mein zu überwachendes Programm in der Registerkarte Anwendungen "Mein Programm" und kann damit eindeutig erkannt werden. In der Registerkarte PRozess heißt es jedoch "java.exe" und ist damit uneindeutig, sodass eine Überprüfung des Prozessnamens für mein Anliegen leider nicht ausreicht. Hast du zufällig eine Variante, um den Anwendungsnamen zu überprüfen?

Viele Grüße,
Sinzal
Member: SaschaRD
Solution SaschaRD Mar 17, 2016 updated at 10:03:13 (UTC)
Goto Top
Morgen Sinzal,

ich Poste hier nochmal den Code, um das Ganze zu verdeutlichen:
$Program = "MEINPROGRAMMNAME"  
$CheckProgramResponding = Get-Process $Program | Where-Object {$_.MainWindowHanlde -ne 0} | Select-Object Name, Responding, MainWindowTitle
IF (!$CheckProgramResponding.Responding){
	Write-Host "Reagiert nicht! Werde es beenden.."  
	TASKKILL /F /T /IM "$Program.exe"  
	Write-Host "Beendet! Starte es neu.."  
	Start-Process PFADZUMEINEMPROGRAMM
} ELSE {
	Write-Host "Reagiert!"  
}
Den angegeben Namen in der Variable $Program wird in der Tat als MEINPROGRAMMNAME.exe gesucht (siehe Zeile 05).
Da dein Fenstertitel nicht gleich dem Prozessnamen entspricht kannst Du wie folgt vorgehen. In der Variable $CheckProgramResponding sind bereits alle Information hinterlegt:
$Program = "MEINPROGRAMMNAME"  
$CheckProgramResponding = Get-Process $Program | Where-Object {$_.MainWindowHanlde -ne 0} | Select-Object Name, Responding, MainWindowTitle
IF (!$CheckProgramResponding.Responding){
	Write-Host "Reagiert nicht! Werde es beenden.."  
	TASKKILL /F /T /FI "WINDOWTITLE eq $($CheckProgramResponding.MainWindowTitle)"  
	Write-Host "Beendet! Starte es neu.."  
	Start-Process PFADZUMEINEMPROGRAMM
} ELSE {
	Write-Host "Reagiert!"  
}
Somit wird nicht mehr das Programm nachdem Namen des Prozesses beendet (siehe geänderte Zeile 05), sondern nachdem Namen des Fenstertitels.

Gruß, Sascha
Member: Sinzal
Sinzal Mar 17, 2016 at 13:22:40 (UTC)
Goto Top
Hallo SaschaRD,

danke für die Hinweise. Leider hilft mir das in dem konkreten Fall bisher auch nicht weiter. Ich habe bei MEINPROGRAMMNAME java.exe eingetragen und für WINDOWTITLE müsste ich "Mein Programm" eingeben. Nun gibt es aber mehrere java.exe-Prozesse auf dem Server. Mit der IF-Abfrage erhält das Script nur Info darüber, ob irgendeine java.exe aktiv ist. Das muss aber noch nicht heißen, dass "Mein Programm" aktiv ist. Sobald das Script eine aktive java.exe erkennt, schreibt es "Reagiert!" und beendet sich. Dennoch kann es sein, dass "Mein Programm" inaktiv ist. Kann man in der IF-Abfrage etwas einbauen, um zu testen, ob ein Prozess mit dem WINDOWTITLE "Mein Programm" antwortet?

Viele Grüße,
Sinzal
Member: Sinzal
Sinzal Mar 17, 2016 updated at 13:56:55 (UTC)
Goto Top
Hallo SaschaRD,

ich melde mich nochmal zurück, weil ich eine Lösung gefunden habe: In Zeile 2 deines Skrips frage ich zusätzlich im Abschnitt Where-Object den Anwendungstitel ab, sodass ich exakt das Programm mit dem Titel "Mein Programm" auf Aktivität prüfen kann. Ist es Inaktiv, starte ich es mit meiner Startup.bat neu. Das ganze Skript ist folgendes:

$Program = "java"  
$CheckProgramResponding = Get-Process $Program | Where-Object {$_.MainWindowHanlde -ne 0 -and $_.MainWindowTitle -eq "Mein Programm"} | Select-Object Name, Responding, MainWindowTitle  
IF (!$CheckProgramResponding.Responding){
	Write-Host "Starte Mein Programm neu.."  
        c:
        cd PFADZUMEINEMPROGRAMM
	Start-Process startup.bat
} ELSE {
	Write-Host "Mein Programm aktiv. OK."  
}

Dieses Skript lasse ich nun durch die Aufgabenverwaltung von Windows alle 5 Minuten laufen und dadurch checken, ob Mein Programm schon wieder abgestürzt ist. Im Zweifel startet das Skript Mein Programm neu.

Vielen Dank für deine Hilfe!!!!!

Viele Grüße,
Sinzal

@MrCount: Danke für das Delphi-Skript, aber ich habe es nun doch nicht mehr überprüft, ob es für meine Frage geholfen hätte.

PS: Ein Powershell-Skript in Aufgabenverwaltung ausführen, siehe: http://www.antary.de/2013/08/16/powershell-skript-als-geplante-aufgabe- ...
PPS: Rechte zum Ausführen von Skripten in Powershell setzen, siehe: http://www.script-example.com/index.php/wie-erstelle-ich-ein-PowerShell ...