读书人

sigar获取单个历程资源(CPU、内存使用

发布时间: 2013-07-16 22:38:05 作者: rapoo

sigar获取单个进程资源(CPU、内存使用率)
我利用sigar做了一个监控程序,用于监控机器硬件性能。
但是我只会用sigar获取服务器整体的CPU、内存使用率,
无法根据pid获取指定进程的资源信息。

在网上也找了一段时间,
感觉sigar应该是可以实现这个功能的,
只是我不知道该怎么写。

也找了一些代码,但运行的时候报了一个奇怪的异常,
一直无法解决,请你们帮我看看,
或者告诉我应该怎么写。

代码:
1.public static void getProCpu(String pro_name) throws SigarException {
2.Sigar sigar = new Sigar();
3.long[] pids = sigar.getProcList();
4.for (long pid : pids) {
5.ProcState prs = sigar.getProcState(pid);
6.ProcCpu pCpu = new ProcCpu();
7.pCpu.gather(sigar, pid);
8.System.out.println(prs.getName());
9.}
10.}

运行时异常:发生在第7行
Exception in thread "main" org.hyperic.sigar.SigarPermissionDeniedException: ??????
at org.hyperic.sigar.ProcCpu.gather(Native Method)
at com.sunyard.equ.EquInfo.getProCpu(EquInfo.java:95)
at com.sunyard.equ.EquInfo.main(EquInfo.java:101)

我把sigar的源码反编译出来看了下,发现gather是一个native方法,实在没办法。。。
[解决办法]
我这里有一个弄了几天才弄出来的代码送上


import java.util.ArrayList;
import java.util.List;

import org.hyperic.sigar.CpuInfo;
import org.hyperic.sigar.CpuPerc;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;
import org.hyperic.sigar.cmd.Ps;

import com.yangdun.client.vo.ProcessInfo;

public class AllInfo {

private Sigar sigar = new Sigar();

private StringBuilder builder;

//获取进程的相关信息
private List<ProcessInfo> getProcessInfo(){
Ps ps = new Ps();
List<ProcessInfo> processInfos = new ArrayList<ProcessInfo>();
try {
long[] pids = sigar.getProcList();
for(long pid : pids){
List<String> list = ps.getInfo(sigar, pid);
ProcessInfo info = new ProcessInfo();
for(int i = 0; i <= list.size(); i++){
switch(i){
case 0 : info.setPid(list.get(0)); break;
case 1 : info.setUser(list.get(1)); break;


case 2 : info.setStartTime(list.get(2)); break;
case 3 : info.setMemSize(list.get(3)); break;
case 4 : info.setMemUse(list.get(4)); break;
case 5 : info.setMemhare(list.get(5)); break;
case 6 : info.setState(list.get(6)); break;
case 7 : info.setCpuTime(list.get(7)); break;
case 8 : info.setName(list.get(8)); break;
}
}
processInfos.add(info);
}
} catch (SigarException e) {
e.printStackTrace();
}
return processInfos;
}


public static void main(String[] args) {
AllInfo info = new AllInfo();
List<ProcessInfo> processInfos = info.getProcessInfo();
System.out.println();
}

}

//对进程信息进行包装
public class ProcessInfo {

private String pid;

private String user;

private String startTime;

private String memSize;

private String memUse;

private String memhare;

private String state;

private String cpuTime;

private String name;

public String getPid() {
return pid;
}

public void setPid(String pid) {
this.pid = pid;
}

public String getUser() {
return user;
}

public void setUser(String user) {
this.user = user;
}

public String getStartTime() {
return startTime;
}

public void setStartTime(String startTime) {
this.startTime = startTime;
}

public String getMemSize() {
return memSize;
}

public void setMemSize(String memSize) {
this.memSize = memSize;
}

public String getMemUse() {
return memUse;
}

public void setMemUse(String memUse) {
this.memUse = memUse;
}

public String getMemhare() {
return memhare;
}

public void setMemhare(String memhare) {
this.memhare = memhare;
}

public String getState() {
return state;
}

public void setState(String state) {
this.state = state;
}

public String getCpuTime() {


return cpuTime;
}

public void setCpuTime(String cpuTime) {
this.cpuTime = cpuTime;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

}


读书人网 >Java相关

热点推荐