我在同一台机器上运行两个不同的.jar程序。我希望能够检测到其中一个已关闭或不再运行。
我遇到的这个问题是,在运行此代码时:
var allProc = Process.GetProcesses();
foreach (var p in allProc)
comboBox1.Items.Add(p.ProcessName);
comboBox1.Sorted = true;
它只显示运行Java的单个实例,而不仅仅是它没有显示任何进程名称。
我想要监控的程序使用了大量的RAM,所以我考虑监控RAM的使用情况并在达到一定水平时做我需要的东西,但对我来说这听起来像是一种黑客的做法和其他因素可以影响它。
有什么想法吗?
答案 0 :(得分:2)
您可以使用System.Diagnostics.Process
获取您正在寻找的父流程的流程ID 。
然后,您可以通过(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"];
}
}
答案 1 :(得分:2)
前一段时间我有同样的问题,对我来说最好的解决方案是将java Programm作为孩子运行。
实施例
server = new Process();
server.StartInfo.FileName = "java";
server.StartInfo.Arguments = "-Xmx4000M -jar forge.jar nogui";
server.Start();
然后简单
status = server.HasExited;
答案 2 :(得分:1)
JDK附带了一个名为jps的命令行工具。
jps -v
显示您传递给java的所有参数。它提供以下输出:
lvmid [ [ classname | JARfilename | "Unknown"] [ arg* ] [ jvmarg* ] ]
您可以从c#调用jps然后读取输出。