2013-04-21 100 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的」