2013-04-21 6 views
1

Я пытаюсь выяснить, как получить list системных процессов, используя Hyperic SIGAR. Это то, что я до сих пор:Получение списка системных процессов в Java с использованием 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. Однако делать это для системных процессов, похоже, не очень хорошо работает. Как я должен это делать?

ответ

0

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

  1. орг/Hyperic/SIGAR/CMD/Ps "CredName.User.eq = $ USER"

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

  1. орг/Hyperic/SIGAR/CMD/Ps "State.Name.eq = SSHD"
Смежные вопросы