电脑信息监控模块:Sigar介绍(适用于JAVA、PYTHON、C#等)

来源:互联网 发布:网络创业项目 编辑:程序博客网 时间:2024/05/18 17:43

原文地址:http://blog.csdn.net/yaerfeng/article/details/7018362



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中的使用:

示例代码:

Java代码  
[java] view plain copy
 print?
  1. package cn.jsi.buaa;    
  2.     
  3. import org.hyperic.sigar.Cpu;    
  4.     
  5. import org.hyperic.sigar.CpuInfo;    
  6.     
  7. import org.hyperic.sigar.CpuPerc;    
  8.     
  9. import org.hyperic.sigar.Sigar;    
  10.     
  11. import org.hyperic.sigar.SigarException;    
  12.     
  13. import com.thoughtworks.xstream.XStream;    
  14.     
  15. /**  
  16.   
  17. * Cpu数据  
  18.   
  19.  
  20.   
  21. * 使用Sigar获得CPU的基本信息、使用百分比、使用时间  
  22.   
  23.  
  24.   
  25. */    
  26.     
  27. public class SigarTest {    
  28.     
  29. private CpuInfo info;    
  30.     
  31. private CpuPerc perc;    
  32.     
  33. private Cpu timer;    
  34.     
  35. public SigarTest() {    
  36.     
  37. }    
  38.     
  39. public void populate(Sigar sigar) throws SigarException {    
  40.     
  41. info = sigar.getCpuInfoList()[0];    
  42.     
  43. perc = sigar.getCpuPerc();    
  44.     
  45. timer = sigar.getCpu();    
  46.     
  47. }    
  48.     
  49. public static SigarTest gather(Sigar sigar) throws SigarException {    
  50.     
  51. SigarTest data = new SigarTest();    
  52.     
  53. data.populate(sigar);    
  54.     
  55. return data;    
  56.     
  57. }    
  58.     
  59. public static void main(String[] args) throws Exception {    
  60.     
  61. System.out.println(System.getProperty("java.library.path"));    
  62.     
  63. Sigar sigar = new Sigar();    
  64.     
  65. SigarTest cpuData = SigarTest.gather(sigar);    
  66.     
  67. XStream xstream = new XStream();    
  68.     
  69. xstream.alias("CpuData", SigarTest.class);    
  70.     
  71. System.out.println(xstream.toXML(cpuData));    
  72.     
  73. }    
  74.     
  75. }    

 



Windows:将sigar.jar包放到classpath下,将sigar-amd64-winnt.dll放到环境变量java.library.path下。
Linux:将sigar.jar包放到classpath下,将libsigar-x86-linux.so放到环境变量java.library.path下。


获取网卡的流量

和网卡相关的统计数据主要有:网卡信息(ip地址、子网掩码、mac地址等)、网卡的吞吐量、流量等等。 

当然了使用sigar也可以获得这些数据。 

下面通过例子说明: 

Java代码

Java代码  收藏代码
 
[java] view plain copy
 print?
  1. 1package lab.sigar;      
  2. 2.      
  3. 3import java.util.ArrayList;      
  4. 4import java.util.List;      
  5. 5.      
  6. 6import org.hyperic.sigar.NetInterfaceConfig;      
  7. 7import org.hyperic.sigar.NetInterfaceStat;      
  8. 8import org.hyperic.sigar.Sigar;      
  9. 9import org.hyperic.sigar.SigarException;      
  10. 10.      
  11. 11import com.thoughtworks.xstream.XStream;      
  12. 12.      
  13. 13/**  
  14. 14. * 网卡信息、接口数据、流量  
  15. 15. *  
  16. 16. * 使用Sigar获得网卡信息  
  17. 17. *  
  18. 18. */     
  19. 19public class NetInterfaceData {      
  20. 20.      
  21. 21.     private NetInterfaceConfig config;      
  22. 22.     private NetInterfaceStat stat;      
  23. 23.     private long rxbps;      
  24. 24.     private long txbps;      
  25. 25.      
  26. 26.     public NetInterfaceData() {}      
  27. 27.      
  28. 28.     public void populate(Sigar sigar, String name)      
  29. 29.         throws SigarException {      
  30. 30.      
  31. 31.          config = sigar.getNetInterfaceConfig(name);      
  32. 32.      
  33. 33.         try {      
  34. 34.                   
  35. 35.             long start = System.currentTimeMillis();      
  36. 36.              NetInterfaceStat statStart = sigar.getNetInterfaceStat(name);      
  37. 37.             long rxBytesStart = statStart.getRxBytes();      
  38. 38.             long txBytesStart = statStart.getTxBytes();      
  39. 39.              Thread.sleep(1000);      
  40. 40.             long end = System.currentTimeMillis();      
  41. 41.              NetInterfaceStat statEnd = sigar.getNetInterfaceStat(name);      
  42. 42.             long rxBytesEnd = statEnd.getRxBytes();      
  43. 43.             long txBytesEnd = statEnd.getTxBytes();      
  44. 44.                   
  45. 45.              rxbps = (rxBytesEnd - rxBytesStart)*8/(end-start)*1000;      
  46. 46.              txbps = (txBytesEnd - txBytesStart)*8/(end-start)*1000;      
  47. 47.              stat = sigar.getNetInterfaceStat(name);      
  48. 48.          } catch (SigarException e) {      
  49. 49.                   
  50. 50.          } catch (Exception e) {      
  51. 51.                   
  52. 52.          }      
  53. 53.      }      
  54. 54.      
  55. 55.     public static NetInterfaceData gather(Sigar sigar, String name)      
  56. 56.         throws SigarException {      
  57. 57.           
  58. 58.          NetInterfaceData data = new NetInterfaceData();      
  59. 59.          data.populate(sigar, name);      
  60. 60.         return data;      
  61. 61.      }      
  62. 62.      
  63. 63.     public NetInterfaceConfig getConfig() {      
  64. 64.         return config;      
  65. 65.      }      
  66. 66.      
  67. 67.     public NetInterfaceStat getStat() {      
  68. 68.         return stat;      
  69. 69.      }      
  70. 70.           
  71. 71.           
  72. 72.           
  73. 73.     public long getRxbps() {      
  74. 74.         return rxbps;      
  75. 75.      }      
  76. 76.      
  77. 77.     public long getTxbps() {      
  78. 78.         return txbps;      
  79. 79.      }      
  80. 80.      
  81. 81.     public static void main(String[] args) throws Exception {      
  82. 82.          Sigar sigar = new Sigar();      
  83. 83.          String[] netIfs = sigar.getNetInterfaceList();      
  84. 84.          List netIfList = new ArrayList();      
  85. 85.         for ( String name:netIfs ) {      
  86. 86.              NetInterfaceData netIfData1 = NetInterfaceData.gather(sigar, name);      
  87. 87.              netIfList.add(netIfData1);      
  88. 88.          }      
  89. 89.          XStream xstream = new XStream();      
  90. 90.          xstream.alias("NetInterfaceDatas", List.class);      
  91. 91.          xstream.alias("NetInterfaceData", NetInterfaceData.class);      
  92. 92.          System.out.println(xstream.toXML(netIfList));      
  93. 93.      }      
  94. 94. }     



获取内存数据

内存的主要指标有:物理内存的大小、使用数、剩余数;交换内存的大小、使用数、剩余数;RAM的大小等等。 

下面通过例子说明: 

Java代码

Java代码  
[java] view plain copy
 print?
  1. 1package lab.sigar;      
  2. 2.      
  3. 3import org.hyperic.sigar.Mem;      
  4. 4import org.hyperic.sigar.Sigar;      
  5. 5import org.hyperic.sigar.SigarException;      
  6. 6import org.hyperic.sigar.Swap;      
  7. 7.      
  8. 8import com.thoughtworks.xstream.XStream;      
  9. 9.      
  10. 10/**  
  11. 11. * 内存数据  
  12. 12. *  
  13. 13. * 使用Sigar获得系统内存信息  
  14. 14. *  
  15. 15. */     
  16. 16public class MemoryData {      
  17. 17.     private Mem mem;      
  18. 18.     private Swap swap;      
  19. 19.      
  20. 20.     public MemoryData() {      
  21. 21.      }      
  22. 22.      
  23. 23.     public void populate(Sigar sigar) throws SigarException {      
  24. 24.          mem = sigar.getMem();      
  25. 25.          swap = sigar.getSwap();      
  26. 26.      }      
  27. 27.      
  28. 28.     public static MemoryData gather(Sigar sigar) throws SigarException {      
  29. 29.          MemoryData data = new MemoryData();      
  30. 30.          data.populate(sigar);      
  31. 31.         return data;      
  32. 32.      }      
  33. 33.           
  34. 34.     public static void main(String[] args) throws Exception {      
  35. 35.          Sigar sigar = new Sigar();      
  36. 36.          MemoryData memData = MemoryData.gather(sigar);      
  37. 37.          XStream xstream = new XStream();      
  38. 38.          xstream.alias("MemData", MemoryData.class);      
  39. 39.          System.out.println(xstream.toXML(memData));      
  40. 40.      }      
  41. 41.      
  42. 42. }   

 
 



输出: 
Xml代码

Xml代码  收藏代码
  1. [java] view plain copy
     print?
    1. 1package lab.sigar;      
    2. 2.      
    3. 3import org.hyperic.sigar.Mem;      
    4. 4import org.hyperic.sigar.Sigar;      
    5. 5import org.hyperic.sigar.SigarException;      
    6. 6import org.hyperic.sigar.Swap;      
    7. 7.      
    8. 8import com.thoughtworks.xstream.XStream;      
    9. 9.      
    10. 10/**  
    11. 11. * 内存数据  
    12. 12. *  
    13. 13. * 使用Sigar获得系统内存信息  
    14. 14. *  
    15. 15. */     
    16. 16public class MemoryData {      
    17. 17.     private Mem mem;      
    18. 18.     private Swap swap;      
    19. 19.      
    20. 20.     public MemoryData() {      
    21. 21.      }      
    22. 22.      
    23. 23.     public void populate(Sigar sigar) throws SigarException {      
    24. 24.          mem = sigar.getMem();      
    25. 25.          swap = sigar.getSwap();      
    26. 26.      }      
    27. 27.      
    28. 28.     public static MemoryData gather(Sigar sigar) throws SigarException {      
    29. 29.          MemoryData data = new MemoryData();      
    30. 30.          data.populate(sigar);      
    31. 31.         return data;      
    32. 32.      }      
    33. 33.           
    34. 34.     public static void main(String[] args) throws Exception {      
    35. 35.          Sigar sigar = new Sigar();      
    36. 36.          MemoryData memData = MemoryData.gather(sigar);      
    37. 37.          XStream xstream = new XStream();      
    38. 38.          xstream.alias("MemData", MemoryData.class);      
    39. 39.          System.out.println(xstream.toXML(memData));      
    40. 40.      }      
    41. 41.      
    42. 42. }   



0 0