Получение списка системных процессов в Java с использованием Hyperic SIGAR

Я пытаюсь выяснить, как получить 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 документация не кажется очень полезной. Когда я хотел получить доступ к информации об использовании процессора и оперативной памяти, я использовал аналогичный метод получения Humidor, получив SIGARProxy из него, а затем получать информационные объекты (CPU и Mem соответственно) из SIGARProxy, Тем не менее, выполнение этого для системных процессов, похоже, работает не очень хорошо. Как я должен это сделать?

1 ответ

Вы можете проверить класс "Ps" в пакете org.hyperic.sigar.cmd, поставляемом вместе с пакетом Sigar. В нем перечислены все процессы, запущенные в системе. Я уверен, что вы можете манипулировать им, чтобы получить системные процессы, а также. Вы можете отфильтровать вывод с помощью этих параметров:

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

или, если вы хотите искать конкретный процесс, используйте это:

  1. org / hyperic / sigar / cmd / Ps "State.Name.eq = sshd"
Другие вопросы по тегам