我试图弄清楚如何使用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,然后从SIGARProxy获取信息对象(分别为CPU和Mem)。 。但是,对系统进程执行此操作似乎效果不佳。我应该怎么做?

最佳答案

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


org / hyperic / sigar / cmd / Ps“ CredName.User.eq = $ USER”


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


org / hyperic / sigar / cmd / Ps“ State.Name.eq = sshd”

关于java - 使用Hyperic SIGAR获取Java中的系统进程列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16135459/

10-11 17:09