2017-08-10 27 views
3

geschlossen wurde Ich habe zwei verschiedene .jar-Programme, die auf demselben Computer ausgeführt werden. Ich möchte erkennen können, wenn einer von ihnen geschlossen wurde oder nicht mehr läuft.Ermitteln, wann ein bestimmtes Programm mit C#

Dieses Problem, das I habe, wenn Sie diesen Code ausführen:

var allProc = Process.GetProcesses(); 
    foreach (var p in allProc) 

    comboBox1.Items.Add(p.ProcessName); 
    comboBox1.Sorted = true; 

Es zeigt nur eine einzelne Instanz von Java ausgeführt wird, und nicht nur, dass es nicht eine der beiden Prozessnamen nicht zeigen. Das Programm, das ich überwachen möchte, verwendet viel RAM, also habe ich über die Überwachung der RAM-Nutzung nachgedacht und mache das, was ich brauche, wenn es unter ein bestimmtes Niveau fällt, aber für mich hört sich das nach Hacky-Art an Faktoren könnten es beeinflussen.

Irgendwelche Ideen?

Antwort

2

Sie können System.Diagnostics.Process verwenden, um die Prozess Id für den übergeordneten Prozess, den Sie suchen.

Von dort können Sie dann WMI verwenden, um durch den (System.Management) Namensraum für die untergeordneten Prozesse zu suchen:

Process[] javaProcesses = Process.GetProcessesByName("somejavaapp.exe"); 
foreach (Process proc in javaProcesses) 
{ 
    ManagementObjectSearcher searcher = new ManagementObjectSearcher(
    "SELECT * " + 
    "FROM Win32_Process " + 
    "WHERE ParentProcessId=" + proc.Id); 

    ManagementObjectCollection collection = searcher.Get(); 

    // Choose what to do with the child processes. 
    foreach (var childProcess in collection) 
    { 
     var childProcessId = (UInt32)childProcess["ProcessId"]; 
    } 
} 
2

ich das gleiche Problem vor einiger Zeit hatte, für mich die beste Lösung war die Java läuft Programm als Kind.

Beispiel

server = new Process(); 
    server.StartInfo.FileName = "java"; 
    server.StartInfo.Arguments = "-Xmx4000M -jar forge.jar nogui"; 
    server.Start(); 

Dann einfach

status = server.HasExited; 
1

Es ist ein Kommandozeilen-Tool, das mit dem JDK jps genannt kommt. jps -v zeigt alle Argumente an, die Sie an Java übergeben haben. Es liefert die folgende Ausgabe:

lvmid [ [ classname | JARfilename | "Unknown"] [ arg* ] [ jvmarg* ] ]

Sie können JPS von C# aufrufen und dann die Ausgabe lesen.

Verwandte Themen