2017-08-10 45 views
3

同じマシン上で実行される2つの異なる.jarプログラムがあります。私はそれらのうちの1つが閉じられたか、またはもはや実行されていないことを検出できるようにしたい。特定のプログラムがC#で終了したときの検出

このコードを実行しているときに私が午前この問題は、次のとおりです。

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

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

それだけで動作するJavaの単一のインスタンスを示しており、だけでなく、それがプロセス名のいずれかを示していないこと。

私が監視したいプログラムはたくさんのRAMを使用しているので、RAMの使用状況を監視し、あるレベル以下に低下するときに必要なことをやってみることを考えましたが、要因がそれに影響する可能性があります。

アイデア?

答えて

2

あなたが探している親プロセスのためのプロセスIDを取得するためにSystem.Diagnostics.Processを使用することができます。

そこから、あなたはその後、子プロセスを検索するために(System.Management)の名​​前空間を通じてWMIを使用することができます。

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がjpsと呼ばれる付属していますコマンドラインツールがあります。 jps -vには、javaに渡したすべての引数が表示されます。それは次のような出力を提供します。

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

あなたは、C#からJPSを呼び出し、出力を読み取ることができます。

関連する問題