2017-08-10 45 views
3

我有兩個不同的.jar程序運行在同一臺機器上。我希望能夠檢測到其中一個已關閉或不再運行。特定程序程序關閉時檢測C#

,我有是,運行此代碼時,此問題:

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

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

,僅顯示了Java的單一實例上運行,不僅如此它不顯示任何過程的名稱。

我想監視的程序使用了大量的RAM,所以我想了解如何監視RAM使用情況並在低於某個級別時執行我所需要的操作,但對於我來說,這聽起來像是一種冒險的方式因素可能會影響它。

任何想法?

回答

2

您可以使用System.Diagnostics.Process獲取您要查找的父進程的進程ID

從那裏,你就可以使用WMI通過(System.Management)命名空間來尋找孩子的過程:

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

我前一陣子有同樣的問題,對我來說最好的解決辦法是運行java程序作爲孩子。

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

然後簡單地

status = server.HasExited; 
1

有一個命令行工具隨附JDK稱爲jpsjps -v顯示您傳遞給java的所有參數。它提供了以下的輸出:

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

您還可以從C#JPS,然後讀取輸出。