2013-04-21 36 views
1

我想弄清楚如何使用Hyperic SIGAR获取系统进程的list。这是我到目前为止:使用Hyperic获取Java系统进程列表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,然后从SIGARProxy获取信息对象(分别为CPU和Mem)。但是,为系统进程执行此操作似乎并不能很好地工作。我该如何做到这一点?

回答

0

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

  1. 组织/ Hyperic公司/ SIGAR/CMD/PS “CredName.User.eq = $ USER”

,或者如果你要搜索particualr过程中使用此:

  1. 组织/ Hyperic公司/ SIGAR/CMD/PS “State.Name.eq = sshd的”
相关问题