ava如何实现系统监控、系统信息收集、sigar开源API的学习(转)
转自:http://liningjustsoso.iteye.com/blog/1254584
首先给大家介绍一个开源工具Sigar
官网:http://sigar.hyperic.com/
API:http://www.hyperic.com/support/docs/sigar/index-all.html(由于是英文的,英文不好的可以用谷歌浏览器的翻译功能,直接转换为简体中文进行阅读)
Sigar(System Information Gatherer And Reporter),是一个开源的工具,提供了跨平台的系统信息收集的API,由C语言实现的。可以收集的信息包括:
1, CPU信息,包括基本信息(vendor、model、mhz、cacheSize)和统计信息(user、sys、idle、nice、wait)
2, 文件系统信息,包括Filesystem、Size、Used、Avail、Use%、Type
3, 事件信息,类似Service Control Manager
4, 内存信息,物理内存和交换内存的总数、使用数、剩余数;RAM的大小
5, 网络信息,包括网络接口信息和网络路由信息
6, 进程信息,包括每个进程的内存、CPU占用数、状态、参数、句柄
7, IO信息,包括IO的状态,读写大小等
8, 服务状态信息
9, 系统信息,包括操作系统版本,系统资源限制情况,系统运行时间以及负载,JAVA的版本信息等.
Sigar在Java中的使用:
开发时将附件中sigar.rar中的所有文件及jar包放在工程的lib文件夹下。
官网:http://sigar.hyperic.com/
API:http://www.hyperic.com/support/docs/sigar/index-all.html(由于是英文的,英文不好的可以用谷歌浏览器的翻译功能,直接转换为简体中文进行阅读)
Sigar(System Information Gatherer And Reporter),是一个开源的工具,提供了跨平台的系统信息收集的API,由C语言实现的。可以收集的信息包括:
1, CPU信息,包括基本信息(vendor、model、mhz、cacheSize)和统计信息(user、sys、idle、nice、wait)
2, 文件系统信息,包括Filesystem、Size、Used、Avail、Use%、Type
3, 事件信息,类似Service Control Manager
4, 内存信息,物理内存和交换内存的总数、使用数、剩余数;RAM的大小
5, 网络信息,包括网络接口信息和网络路由信息
6, 进程信息,包括每个进程的内存、CPU占用数、状态、参数、句柄
7, IO信息,包括IO的状态,读写大小等
8, 服务状态信息
9, 系统信息,包括操作系统版本,系统资源限制情况,系统运行时间以及负载,JAVA的版本信息等.
Sigar在Java中的使用:
开发时将附件中sigar.rar中的所有文件及jar包放在工程的lib文件夹下。
1 package com.test_sigar; 2 3 import java.net.InetAddress; 4 import java.net.UnknownHostException; 5 import java.text.DecimalFormat; 6 7 import org.hyperic.sigar.CpuInfo; 8 import org.hyperic.sigar.CpuPerc; 9 import org.hyperic.sigar.FileSystem; 10 import org.hyperic.sigar.FileSystemUsage; 11 import org.hyperic.sigar.Mem; 12 import org.hyperic.sigar.NetFlags; 13 import org.hyperic.sigar.NetInterfaceConfig; 14 import org.hyperic.sigar.NetInterfaceStat; 15 import org.hyperic.sigar.OperatingSystem; 16 import org.hyperic.sigar.Sigar; 17 import org.hyperic.sigar.SigarException; 18 import org.hyperic.sigar.SigarNotImplementedException; 19 import org.hyperic.sigar.Swap; 20 21 public class SysInfo { 22 23 public static void main(String [] args) throws Exception{ 24 SysInfo s =new SysInfo(); 25 System.out.println("CPU个数:"+s.getCpuCount()); 26 s.getCpuTotal(); 27 s.testCpuPerc(); 28 s.getPhysicalMemory(); 29 s.testWho(); 30 s.testFileSystemInfo(); 31 s.testGetOSInfo(); 32 } 33 /** 34 * 1.CPU资源信息 35 */ 36 37 // a)CPU数量(单位:个) 38 public static int getCpuCount() throws SigarException { 39 Sigar sigar = new Sigar(); 40 try { 41 return sigar.getCpuInfoList().length; 42 } finally { 43 sigar.close(); 44 } 45 } 46 47 // b)CPU的总量(单位:HZ)及CPU的相关信息 48 public void getCpuTotal() { 49 Sigar sigar = new Sigar(); 50 CpuInfo[] infos; 51 try { 52 infos = sigar.getCpuInfoList(); 53 for (int i = 0; i < infos.length; i++) {// 不管是单块CPU还是多CPU都适用 54 CpuInfo info = infos[i]; 55 System.out.println("CPU的总量:" + info.getMhz());// CPU的总量MHz 56 System.out.println("获得CPU的卖主:" + info.getVendor());// 获得CPU的卖主,如:Intel 57 System.out.println("CPU的类别:" + info.getModel());// 获得CPU的类别,如:Celeron 58 System.out.println("缓冲存储器数量:" + info.getCacheSize());// 缓冲存储器数量 59 System.out.println("**************"); 60 } 61 } catch (SigarException e) { 62 e.printStackTrace(); 63 } 64 } 65 66 // c)CPU的用户使用量、系统使用剩余量、总的剩余量、总的使用占用量等(单位:100%) 67 public void testCpuPerc() { 68 Sigar sigar = new Sigar(); 69 // 方式一,主要是针对一块CPU的情况 70 CpuPerc cpu; 71 try { 72 cpu = sigar.getCpuPerc(); 73 printCpuPerc(cpu); 74 } catch (SigarException e) { 75 e.printStackTrace(); 76 } 77 // 方式二,不管是单块CPU还是多CPU都适用 78 CpuPerc cpuList[] = null; 79 try { 80 cpuList = sigar.getCpuPercList(); 81 } catch (SigarException e) { 82 e.printStackTrace(); 83 return; 84 } 85 for (int i = 0; i < cpuList.length; i++) { 86 printCpuPerc(cpuList[i]); 87 } 88 } 89 90 private void printCpuPerc(CpuPerc cpu) { 91 System.out.println("用户使用率:" + CpuPerc.format(cpu.getUser()));// 用户使用率 92 System.out.println("系统使用率:" + CpuPerc.format(cpu.getSys()));// 系统使用率 93 System.out.println("当前等待率:" + CpuPerc.format(cpu.getWait()));// 当前等待率 94 System.out.println("Nice :" + CpuPerc.format(cpu.getNice()));// 95 System.out.println("当前空闲率:" + CpuPerc.format(cpu.getIdle()));// 当前空闲率 96 System.out.println("总的使用率:" + CpuPerc.format(cpu.getCombined()));// 总的使用率 97 System.out.println("**************"); 98 } 99 100 /** 101 * 2.内存资源信息 102 * 103 */ 104 105 public void getPhysicalMemory() { 106 // a)物理内存信息 107 DecimalFormat df = new DecimalFormat("#0.00"); 108 Sigar sigar = new Sigar(); 109 Mem mem; 110 try { 111 mem = sigar.getMem(); 112 // 内存总量 113 System.out.println("内存总量:" + df.format((float)mem.getTotal() / 1024/1024/1024) + "G"); 114 // 当前内存使用量 115 System.out.println("当前内存使用量:" + df.format((float)mem.getUsed() / 1024/1024/1024) + "G"); 116 // 当前内存剩余量 117 System.out.println("当前内存剩余量:" + df.format((float)mem.getFree() / 1024/1024/1024) + "G"); 118 // b)系统页面文件交换区信息 119 Swap swap = sigar.getSwap(); 120 // 交换区总量 121 System.out.println("交换区总量:" + df.format((float)swap.getTotal() / 1024/1024/1024) + "G"); 122 // 当前交换区使用量 123 System.out.println("当前交换区使用量:" + df.format((float)swap.getUsed() / 1024/1024/1024) + "G"); 124 // 当前交换区剩余量 125 System.out.println("当前交换区剩余量:" + df.format((float)swap.getFree() / 1024/1024/1024) + "G"); 126 } catch (SigarException e) { 127 e.printStackTrace(); 128 } 129 } 130 131 /** 132 * 3.操作系统信息 133 * 134 */ 135 136 // a)取到当前操作系统的名称: 137 public String getPlatformName() { 138 String hostname = ""; 139 try { 140 hostname = InetAddress.getLocalHost().getHostName(); 141 } catch (Exception exc) { 142 Sigar sigar = new Sigar(); 143 try { 144 hostname = sigar.getNetInfo().getHostName(); 145 } catch (SigarException e) { 146 hostname = "localhost.unknown"; 147 } finally { 148 sigar.close(); 149 } 150 } 151 return hostname; 152 } 153 154 // b)取当前操作系统的信息 155 public void testGetOSInfo() { 156 OperatingSystem OS = OperatingSystem.getInstance(); 157 // 操作系统内核类型如: 386、486、586等x86 158 System.out.println("OS.getArch() = " + OS.getArch()); 159 System.out.println("OS.getCpuEndian() = " + OS.getCpuEndian());// 160 System.out.println("OS.getDataModel() = " + OS.getDataModel());// 161 // 系统描述 162 System.out.println("OS.getDescription() = " + OS.getDescription()); 163 System.out.println("OS.getMachine() = " + OS.getMachine());// 164 // 操作系统类型 165 System.out.println("OS.getName() = " + OS.getName()); 166 System.out.println("OS.getPatchLevel() = " + OS.getPatchLevel());// 167 // 操作系统的卖主 168 System.out.println("OS.getVendor() = " + OS.getVendor()); 169 // 卖主名称 170 System.out 171 .println("OS.getVendorCodeName() = " + OS.getVendorCodeName()); 172 // 操作系统名称 173 System.out.println("OS.getVendorName() = " + OS.getVendorName()); 174 // 操作系统卖主类型 175 System.out.println("OS.getVendorVersion() = " + OS.getVendorVersion()); 176 // 操作系统的版本号 177 System.out.println("OS.getVersion() = " + OS.getVersion()); 178 } 179 180 // c)取当前系统进程表中的用户信息 181 public void testWho() { 182 try { 183 Sigar sigar = new Sigar(); 184 org.hyperic.sigar.Who[] who = sigar.getWhoList(); 185 if (who != null && who.length > 0) { 186 for (int i = 0; i < who.length; i++) { 187 System.out.println(" ~~~~~~~~~" + String.valueOf(i) 188 + "~~~~~~~~~"); 189 org.hyperic.sigar.Who _who = who[i]; 190 System.out.println("获取设备getDevice() = " + _who.getDevice()); 191 System.out.println("获得主机getHost() = " + _who.getHost()); 192 System.out.println("获取的时间getTime() = " + _who.getTime()); 193 // 当前系统进程表中的用户名 194 System.out.println("获取用户getUser() = " + _who.getUser()); 195 } 196 } 197 } catch (SigarException e) { 198 e.printStackTrace(); 199 } 200 } 201 202 // 4.资源信息(主要是硬盘) 203 // a)取硬盘已有的分区及其详细信息(通过sigar.getFileSystemList()来获得FileSystem列表对象,然后对其进行编历): 204 public void testFileSystemInfo() throws Exception { 205 Sigar sigar = new Sigar(); 206 FileSystem fslist[] = sigar.getFileSystemList(); 207 DecimalFormat df = new DecimalFormat("#0.00"); 208 // String dir = System.getProperty("user.home");// 当前用户文件夹路径 209 for (int i = 0; i < fslist.length; i++) { 210 System.out.println(" ~~~~~~~~~~" + i + "~~~~~~~~~~"); 211 FileSystem fs = fslist[i]; 212 // 分区的盘符名称 213 System.out.println("fs.getDevName() = " + fs.getDevName()); 214 // 分区的盘符名称 215 System.out.println("fs.getDirName() = " + fs.getDirName()); 216 System.out.println("fs.getFlags() = " + fs.getFlags());// 217 // 文件系统类型,比如 FAT32、NTFS 218 System.out.println("fs.getSysTypeName() = " + fs.getSysTypeName()); 219 // 文件系统类型名,比如本地硬盘、光驱、网络文件系统等 220 System.out.println("fs.getTypeName() = " + fs.getTypeName()); 221 // 文件系统类型 222 System.out.println("fs.getType() = " + fs.getType()); 223 FileSystemUsage usage = null; 224 try { 225 usage = sigar.getFileSystemUsage(fs.getDirName()); 226 } catch (SigarException e) { 227 if (fs.getType() == 2) 228 throw e; 229 continue; 230 } 231 switch (fs.getType()) { 232 case 0: // TYPE_UNKNOWN :未知 233 break; 234 case 1: // TYPE_NONE 235 break; 236 case 2: // TYPE_LOCAL_DISK : 本地硬盘 237 // 文件系统总大小 238 System.out.println(" Total = " + df.format((float)usage.getTotal()/1024/1024) + "G"); 239 // 文件系统剩余大小 240 System.out.println(" Free = " + df.format((float)usage.getFree()/1024/1024) + "G"); 241 // 文件系统可用大小 242 System.out.println(" Avail = " + df.format((float)usage.getAvail()/1024/1024) + "G"); 243 // 文件系统已经使用量 244 System.out.println(" Used = " + df.format((float)usage.getUsed()/1024/1024) + "G"); 245 double usePercent = usage.getUsePercent() * 100D; 246 // 文件系统资源的利用率 247 System.out.println(" Usage = " + df.format(usePercent) + "%"); 248 break; 249 case 3:// TYPE_NETWORK :网络 250 break; 251 case 4:// TYPE_RAM_DISK :闪存 252 break; 253 case 5:// TYPE_CDROM :光驱 254 break; 255 case 6:// TYPE_SWAP :页面交换 256 break; 257 } 258 System.out.println(" DiskReads = " + usage.getDiskReads()); 259 System.out.println(" DiskWrites = " + usage.getDiskWrites()); 260 } 261 return; 262 } 263 264 // 5.网络信息 265 // a)当前机器的正式域名 266 public String getFQDN() { 267 Sigar sigar = null; 268 try { 269 return InetAddress.getLocalHost().getCanonicalHostName(); 270 } catch (UnknownHostException e) { 271 try { 272 sigar = new Sigar(); 273 return sigar.getFQDN(); 274 } catch (SigarException ex) { 275 return null; 276 } finally { 277 sigar.close(); 278 } 279 } 280 } 281 282 // b)取到当前机器的IP地址 283 public String getDefaultIpAddress() { 284 String address = null; 285 try { 286 address = InetAddress.getLocalHost().getHostAddress(); 287 // 没有出现异常而正常当取到的IP时,如果取到的不是网卡循回地址时就返回 288 // 否则再通过Sigar工具包中的方法来获取 289 if (!NetFlags.LOOPBACK_ADDRESS.equals(address)) { 290 return address; 291 } 292 } catch (UnknownHostException e) { 293 // hostname not in DNS or /etc/hosts 294 } 295 Sigar sigar = new Sigar(); 296 try { 297 address = sigar.getNetInterfaceConfig().getAddress(); 298 } catch (SigarException e) { 299 address = NetFlags.LOOPBACK_ADDRESS; 300 } finally { 301 sigar.close(); 302 } 303 return address; 304 } 305 306 // c)取到当前机器的MAC地址 307 public String getMAC() { 308 Sigar sigar = null; 309 try { 310 sigar = new Sigar(); 311 String[] ifaces = sigar.getNetInterfaceList(); 312 String hwaddr = null; 313 for (int i = 0; i < ifaces.length; i++) { 314 NetInterfaceConfig cfg = sigar.getNetInterfaceConfig(ifaces[i]); 315 if (NetFlags.LOOPBACK_ADDRESS.equals(cfg.getAddress()) 316 || (cfg.getFlags() & NetFlags.IFF_LOOPBACK) != 0 317 || NetFlags.NULL_HWADDR.equals(cfg.getHwaddr())) { 318 continue; 319 } 320 /* 321 * 如果存在多张网卡包括虚拟机的网卡,默认只取第一张网卡的MAC地址,如果要返回所有的网卡(包括物理的和虚拟的)则可以修改方法的返回类型为数组或Collection 322 * ,通过在for循环里取到的多个MAC地址。 323 */ 324 hwaddr = cfg.getHwaddr(); 325 break; 326 } 327 return hwaddr != null ? hwaddr : null; 328 } catch (Exception e) { 329 return null; 330 } finally { 331 if (sigar != null) 332 sigar.close(); 333 } 334 } 335 336 // d)获取网络流量等信息 337 public void testNetIfList() throws Exception { 338 Sigar sigar = new Sigar(); 339 String ifNames[] = sigar.getNetInterfaceList(); 340 for (int i = 0; i < ifNames.length; i++) { 341 String name = ifNames[i]; 342 NetInterfaceConfig ifconfig = sigar.getNetInterfaceConfig(name); 343 print(" name = " + name);// 网络设备名 344 print("Address = " + ifconfig.getAddress());// IP地址 345 print("Netmask = " + ifconfig.getNetmask());// 子网掩码 346 if ((ifconfig.getFlags() & 1L) <= 0L) { 347 print("!IFF_UP...skipping getNetInterfaceStat"); 348 continue; 349 } 350 try { 351 NetInterfaceStat ifstat = sigar.getNetInterfaceStat(name); 352 print("RxPackets = " + ifstat.getRxPackets());// 接收的总包裹数 353 print("TxPackets = " + ifstat.getTxPackets());// 发送的总包裹数 354 print("RxBytes = " + ifstat.getRxBytes());// 接收到的总字节数 355 print("TxBytes = " + ifstat.getTxBytes());// 发送的总字节数 356 print("RxErrors = " + ifstat.getRxErrors());// 接收到的错误包数 357 print("TxErrors = " + ifstat.getTxErrors());// 发送数据包时的错误数 358 print("RxDropped = " + ifstat.getRxDropped());// 接收时丢弃的包数 359 print("TxDropped = " + ifstat.getTxDropped());// 发送时丢弃的包数 360 } catch (SigarNotImplementedException e) { 361 } catch (SigarException e) { 362 print(e.getMessage()); 363 } 364 } 365 } 366 367 void print(String msg) { 368 System.out.println(msg); 369 } 370 371 // e)一些其他的信息 372 public void getEthernetInfo() { 373 Sigar sigar = null; 374 try { 375 sigar = new Sigar(); 376 String[] ifaces = sigar.getNetInterfaceList(); 377 for (int i = 0; i < ifaces.length; i++) { 378 NetInterfaceConfig cfg = sigar.getNetInterfaceConfig(ifaces[i]); 379 if (NetFlags.LOOPBACK_ADDRESS.equals(cfg.getAddress()) 380 || (cfg.getFlags() & NetFlags.IFF_LOOPBACK) != 0 381 || NetFlags.NULL_HWADDR.equals(cfg.getHwaddr())) { 382 continue; 383 } 384 System.out.println("cfg.getAddress() = " + cfg.getAddress());// IP地址 385 System.out 386 .println("cfg.getBroadcast() = " + cfg.getBroadcast());// 网关广播地址 387 System.out.println("cfg.getHwaddr() = " + cfg.getHwaddr());// 网卡MAC地址 388 System.out.println("cfg.getNetmask() = " + cfg.getNetmask());// 子网掩码 389 System.out.println("cfg.getDescription() = " 390 + cfg.getDescription());// 网卡描述信息 391 System.out.println("cfg.getType() = " + cfg.getType());// 392 System.out.println("cfg.getDestination() = " 393 + cfg.getDestination()); 394 System.out.println("cfg.getFlags() = " + cfg.getFlags());// 395 System.out.println("cfg.getMetric() = " + cfg.getMetric()); 396 System.out.println("cfg.getMtu() = " + cfg.getMtu()); 397 System.out.println("cfg.getName() = " + cfg.getName()); 398 System.out.println(); 399 } 400 } catch (Exception e) { 401 System.out.println("Error while creating GUID" + e); 402 } finally { 403 if (sigar != null) 404 sigar.close(); 405 } 406 } 407 408 }
- sigar.rar (1.2 MB)