Hyperic-Sigar是一个收集系统各项底层信息的工具集.他有如下特点:
1. 收集信息全面
收集CPU,MEM,NETWORK,PROCESS,IOSTAT等
使用Sigar,你完全可以模仿出cpuinfo,meminfo,top,free,ifconfig,ipconfig,netstat,route,df,du,ps,ls等多种unix平台和windows平台的指令.
2.跨平台,支持多数平台
支持的平台包括:windows系列(32系列,IA64系列,AMD64系列),linux系列,freeBsd系列,HPUnix 系列,Sun solaris/Sparc/Sparc64系列,macOs系列,AIX系列等
3.提供的API接口全面
sigar本身由C语言开发而成,提供了丰富的API接口,包括:JAVA,.NET,PERL,PHP,PYTHON,RUBY
- 通过JAVA API接口调用Sigar,获取系统信息的例子
1.先确定基本Sigar库
Sigar JAVA编程只是JAVA API编程,需要调用Sigar的基本库,因此需要把Sigar基本库放在对应的ClassPath下
注意:Sigar为不同平台提供了不同的库文件.典型的:
windows平台:sigar-x86-winnt.dll
linux平台:libsigar-x86-linux.so或
solaris平台: libsigar-x86-solaris.so或libsigar-sparc-solaris.so或libsigar-sparc64-solaris.so
64位平台:分为至强的libsigar-ia64-linux.so和AMD的libsigar-amd64-linux.so,sigar-amd64-winnt.dll
2. 程序代码
public class SystemInfo {
private Sigar sigar ;
private SigarProxy proxy;
private StringBuilder info = new StringBuilder();
private void sigarInit(boolean isProxy) {
sigar = new Sigar();
if(isProxy)
proxy = SigarProxyCache.newInstance(this.sigar);
}
private void shutdown() {
this.sigar.close();
}
public String getInfo() {
return info.toString();
}
public void clearInfo() {
if ( null != info )
info.delete(0,info.length());
}
private void println(String arg){
info.append(arg+"\n");
}
public String sprintf(String format, Object[] items) {
return new PrintfFormat(format).sprintf(items);
}
public void printf(String format, Object[] items) {
println(sprintf(format, items));
}
|
public void cpuInfo() {
clearInfo();
println("============Current system Cpu information================");
try {
sigarInit(false);
org.hyperic.sigar.CpuInfo[] infos =
this.sigar.getCpuInfoList();
CpuPerc[] cpus =
this.sigar.getCpuPercList();
org.hyperic.sigar.CpuInfo info = infos[0];
long cacheSize = info.getCacheSize();
println("Vendor........." + info.getVendor());
println("Model.........." + info.getModel());
println("Mhz............" + info.getMhz());
println("Total CPUs....." + info.getTotalCores());
println("Physical CPUs.." + info.getTotalSockets());
println("Cores per CPU.." + info.getCoresPerSocket());
if (cacheSize != Sigar.FIELD_NOTIMPL) {
println("Cache size...." + cacheSize);
}
println("");
for (int i=0; i<cpus.length; i++) {
println("CPU " + i + ".........");
outputCpuPerc(cpus[i]);
}
println("Totals........");
outputCpuPerc(this.sigar.getCpuPerc());
} catch (SigarException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
shutdown();
}
}
private void outputCpuPerc(CpuPerc cpu) {
println("User Time....." + CpuPerc.format(cpu.getUser()));
println("Sys Time......" + CpuPerc.format(cpu.getSys()));
println("Idle Time....." + CpuPerc.format(cpu.getIdle()));
println("Wait Time....." + CpuPerc.format(cpu.getWait()));
println("Nice Time....." + CpuPerc.format(cpu.getNice()));
println("Combined......" + CpuPerc.format(cpu.getCombined()));
println("Irq Time......" + CpuPerc.format(cpu.getIrq()));
if (SigarLoader.IS_LINUX) {
println("SoftIrq Time.." + CpuPerc.format(cpu.getSoftIrq()));
println("Stolen Time...." + CpuPerc.format(cpu.getStolen()));
}
println("");
}
|
private static Long format(long value) {
return new Long(value / 1024);
}
public void memInfo() throws SigarException {
clearInfo();
println("============Display information about free and used memory================");
try {
sigarInit(false);
Mem mem = this.sigar.getMem();
Swap swap = this.sigar.getSwap();
Object[] header = new Object[] { "total", "used", "free" };
printf("s s s", header);
Object[] memRow = new Object[] {
format(mem.getTotal()),
format(mem.getUsed()),
format(mem.getFree())
};
printf("Mem: ldK ldK ldK", memRow);
Object[] memPercent = new Object[3];
memPercent[0] = "100%";
double d = mem.getUsedPercent();
d=((int)(d*100))/100; // 取小数点后两位的简便方法
|