使用Hyperic SIGAR获取Java系统进程列表

时间:2013-04-21 19:47:49

标签: java exception process sigar intermittent

我试图找出如何使用list获取Hyperic SIGAR系统进程。这就是我到目前为止所做的:

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,然后从中获取信息对象(分别为CPU和Mem) SIGARProxy。但是,为系统进程执行此操作似乎并不能很好地工作。我该怎么做?

1 个答案:

答案 0 :(得分:0)

你可以查看课程&#34; Ps&#34;在与Sigar包一起提供的org.hyperic.sigar.cmd包下。它列出了系统上运行的所有进程。 我相信你也可以操纵它来获得系统进程。您可以使用以下选项过滤输出:

  1. org / hyperic / sigar / cmd / Ps&#34; CredName.User.eq = $ USER&#34;
  2. 或者如果您想搜索特定进程,请使用此:

    1. org / hyperic / sigar / cmd / Ps&#34; State.Name.eq = sshd&#34;