【发布时间】:2013-04-21 19:47:48
【问题描述】:
我试图弄清楚如何使用Hyperic SIGAR 获取系统进程的list。这是我到目前为止所拥有的:
import org.hyperic.sigar.Humidor;
import org.hyperic.sigar.ProcExe;
import org.hyperic.sigar.SigarException;
import org.hyperic.sigar.SigarProxy;
public class ProcessReader
{
Humidor h;
public ProcessReader()
{
h = Humidor.getInstance();
}
public void printProcessList()
{
SigarProxy sp = h.getSigar();
try
{
long[] pidList = sp.getProcList();
for(int i=0; i<pidList.length; i++)
{
ProcExe temp = sp.getProcExe(pidList[i]);
String exeName = temp.getName();
System.out.println(pidList[i] + " " + exeName);
}
} catch (SigarException e) {
e.printStackTrace();
}
}
}
但是,这最终会在看似任意数量的迭代后引发 SIGAR 异常。例如,有一次,我得到了这个:
1313 /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java
1311 /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdworker
然后它为该行的无效参数抛出Sigar Exception:
ProcExe temp = sp.getProcExe(pidList[i]);
有时,它会运行两次以上的迭代。有时,它运行不到两次迭代。我不太确定发生了什么,SIGAR 文档似乎也不是很有帮助。当我想访问 CPU 和 RAM 使用信息时,我使用了类似的方法,从 Humidor 获取一个 SIGARProxy,然后从 SIGARProxy 获取信息对象(分别为 CPU 和 Mem) .但是,对系统进程执行此操作似乎效果不佳。我该怎么做?
【问题讨论】:
标签: java exception process sigar intermittent