1

我试图弄清楚如何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 使用信息时,我使用了类似的方法,即获取 a HumidorSIGARProxy从中获取 a,然后从SIGARProxy. 但是,为系统进程执行此操作似乎效果不佳。我该怎么做?

4

1 回答 1

0

您可以检查随 Sigar 包一起提供的 org.hyperic.sigar.cmd 包下的“Ps”类。它列出了系统上运行的所有进程。我相信您也可以操纵它来获取系统进程。您可以使用以下选项过滤输出:

  1. org/hyperic/sigar/cmd/Ps "CredName.User.eq=$USER"

或者,如果您想搜索特定过程,请使用以下命令:

  1. org/hyperic/sigar/cmd/Ps "State.Name.eq=sshd"
于 2013-08-27T11:38:30.923 回答