java如何实现系统监控、系统信息收集、sigar开源API的学习

来源:互联网 发布:科目二约车下什么软件 编辑:程序博客网 时间:2024/05/22 15:42

原文: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文件夹下。 


先确定基本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


Java代码  收藏代码
  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("\n~~~~~~~~~" + 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("\n~~~~~~~~~~" + 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("\nname = " + 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. }  
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩总是写错字怎么办 孩子马虎不认真怎么办 小孩计算老出错怎么办 小学生计算总出错怎么办 高中考试总粗心怎么办 孩子考试总是粗心怎么办 一年级孩子考试粗心怎么办 老师说孩子粗心怎么办 计算题总出错怎么办 计算题总是出错怎么办 数学老是计算错误怎么办? 苗木抵扣计算错误怎么办 表格中计算错误怎么办 孩子电视瘾太大怎么办 孩子考试前失眠怎么办 孩子上网瘾了怎么办 孩子考试差家长怎么办 手指肿痛有脓包怎么办 手指脓出来红肿怎么办 手指提重物发麻怎么办 小孩拧伤了怎么办 从小就成绩差怎么办 孩子考试总马虎怎么办 上课不认真怎么办初中 对学习兴趣不大怎么办 小学生做作业粗心大意怎么办 小学生考试总是粗心大意怎么办 脚趾内侧长鸡眼怎么办 五岁宝宝胆小怎么办 孩子偏食挑食老师怎么办 九岁孩没有耐心怎么办 孩子学习太粗心怎么办 害怕自己变疯怎么办 工作太粗心了怎么办 粗心的宝宝该怎么办 孩子身上起范怎么办 又笨又内向怎么办 学生做试卷马虎怎么办 小孩子学习态度不好怎么办 孩子学习态度差怎么办 小孩学习态度不好怎么办