【问题标题】:Getting A List of System Processes in Java Using Hyperic SIGAR使用 Hyperic SIGAR 获取 Java 中的系统进程列表
【发布时间】:2013-04-21 19:47:48
【问题描述】:

我试图弄清楚如何使用Hyperic SIGAR 获取系统进程的list。这是我到目前为止所拥有的:

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) .但是,对系统进程执行此操作似乎效果不佳。我该怎么做?

【问题讨论】:

    标签: java exception process sigar intermittent


    【解决方案1】:

    您可以检查随 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"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-12
      • 2020-01-28
      • 2013-08-26
      • 1970-01-01
      • 1970-01-01
      • 2016-05-29
      • 2017-11-11
      相关资源
      最近更新 更多