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