• java使用sigar获取服务器的信息


    如果我们想要获取服务器的一些基本信息,我们需要如何操作呢?

    在java中,我们可以使用sigar来进行实现,sigar能够实现获取服务器运行时的各项状态信息,如:cpu占用率、内存使用情况等

    话不多说,首先我们需要下载包,我理解这个应该是服务器的探针,可以基于java来进行获取;

    本次使用的是hyperic-sigar-1.6.4.zip;如果需要下载的可以看文末进行获取;

    当然,这个也是需要分64,32和windos,liunx的,不同的类型需要的文件的不同;

    下载之后进行解压,windows将加压后的(路径为:D:\project\sigar\hyperic-sigar-1.6.4\sigar-bin\lib)下的:

    sigar-amd64-winnt.dll或者sigar-x86-winnt.dll上传到:C:\Windows\System32

    linux的将libsigar-x86-linux.so或者libsigar-amd64-linux.so上传到  cd /usr/lib中

    不清楚自己的机器类型的话可以都上传上去

    接下来进行java的开发

    pom文件引入:

    1. <dependency>
    2. <groupId>org.fusesourcegroupId>
    3. <artifactId>sigarartifactId>
    4. <version>1.6.4version>
    5. dependency>

    开发工具类

    1. import org.hyperic.sigar.*;
    2. import org.springframework.stereotype.Component;
    3. import java.net.InetAddress;
    4. import java.net.UnknownHostException;
    5. import java.util.ArrayList;
    6. import java.util.HashMap;
    7. import java.util.List;
    8. import java.util.Map;
    9. @Component
    10. public class SysInfo {
    11. // 1.CPU资源信息
    12. // a)CPU数量(单位:个)
    13. public int getCpuCount() throws SigarException {
    14. Sigar sigar = new Sigar();
    15. try {
    16. return sigar.getCpuInfoList().length;
    17. } finally {
    18. sigar.close();
    19. }
    20. } // b)CPU的总量(单位:HZ)及CPU的相关信息
    21. public List> getCpuTotal() {
    22. Sigar sigar = new Sigar();
    23. CpuInfo[] infos;
    24. List> result = new ArrayList<>();
    25. try {
    26. infos = sigar.getCpuInfoList();
    27. for (int i = 0; i < infos.length; i++) {// 不管是单块CPU还是多CPU都适用
    28. CpuInfo info = infos[i];
    29. Map map = new HashMap<>(16);
    30. map.put("CPU的总量MHz", info.getMhz());
    31. map.put("获得CPU的卖主", info.getVendor());
    32. map.put("获得CPU的类别", info.getModel());
    33. map.put("缓冲存储器数量", info.getCacheSize());
    34. result.add(map);
    35. }
    36. } catch (SigarException e) {
    37. e.printStackTrace();
    38. }
    39. return result;
    40. } // c)CPU的用户使用量、系统使用剩余量、总的剩余量、总的使用占用量等(单位:100%)
    41. public List> testCpuPerc() {
    42. Sigar sigar = new Sigar();
    43. // 方式一,主要是针对一块CPU的情况
    44. CpuPerc cpu;
    45. List> result = new ArrayList<>();
    46. // 方式二,不管是单块CPU还是多CPU都适用
    47. CpuPerc cpuList[] = null;
    48. try {
    49. cpuList = sigar.getCpuPercList();
    50. } catch (SigarException e) {
    51. e.printStackTrace();
    52. }
    53. for (int i = 0; i < cpuList.length; i++) {
    54. Map map = new HashMap<>(16);
    55. map.put("用户使用率", CpuPerc.format(cpuList[i].getUser()));
    56. map.put("系统使用率", CpuPerc.format(cpuList[i].getSys()));
    57. map.put("当前等待率", CpuPerc.format(cpuList[i].getWait()));
    58. map.put("getNice", CpuPerc.format(cpuList[i].getNice()));
    59. map.put("当前空闲率", CpuPerc.format(cpuList[i].getIdle()));
    60. map.put("总的使用率", CpuPerc.format(cpuList[i].getCombined()));
    61. result.add(map);
    62. }
    63. return result;
    64. }
    65. public Map getPhysicalMemory() {
    66. // a)物理内存信息
    67. Sigar sigar = new Sigar();
    68. Mem mem;
    69. Map map = new HashMap<>(16);
    70. try {
    71. mem = sigar.getMem();
    72. // 内存总量
    73. map.put("内存总量", mem.getTotal() / 1024L + "K av");
    74. // 当前内存使用量
    75. // 当前内存剩余量
    76. map.put("当前内存剩余量", mem.getFree() / 1024L + "K free");
    77. // b)系统页面文件交换区信息
    78. Swap swap = sigar.getSwap();
    79. // 交换区总量
    80. map.put("交换区总量", swap.getTotal() / 1024L + "K av");
    81. // 当前交换区使用量
    82. map.put("当前交换区使用量", swap.getUsed() / 1024L + "K used");
    83. // 当前交换区剩余量
    84. map.put("当前交换区剩余量", swap.getFree() / 1024L + "K free");
    85. } catch (SigarException e) {
    86. e.printStackTrace();
    87. }
    88. return map;
    89. }
    90. // 3.操作系统信息
    91. // a)取到当前操作系统的名称:
    92. public String getPlatformName() {
    93. String hostname = "";
    94. try {
    95. hostname = InetAddress.getLocalHost().getHostName();
    96. } catch (Exception exc) {
    97. Sigar sigar = new Sigar();
    98. try {
    99. hostname = sigar.getNetInfo().getHostName();
    100. } catch (SigarException e) {
    101. hostname = "localhost.unknown";
    102. } finally {
    103. sigar.close();
    104. }
    105. }
    106. return hostname;
    107. } // b)取当前操作系统的信息
    108. public Map testGetOSInfo() {
    109. OperatingSystem OS = OperatingSystem.getInstance();
    110. // 操作系统内核类型如: 386、486、586等x86
    111. Map result = new HashMap<>();
    112. Map subtype = new HashMap<>();
    113. subtype.put("OS.getArch()", OS.getArch());
    114. subtype.put("OS.getCpuEndian()", OS.getCpuEndian());
    115. subtype.put("OS.getDataModel()", OS.getDataModel());
    116. subtype.put("OS.getCpuEndian()", OS.getCpuEndian());
    117. subtype.put("OS.getDataModel()", OS.getDataModel());
    118. result.put("操作系统内核类型", subtype);
    119. // 系统描述
    120. Map subdesc = new HashMap<>();
    121. subdesc.put("OS.getDescription()", OS.getDescription());
    122. subdesc.put("OS.getMachine()", OS.getMachine());
    123. result.put("系统描述", subdesc);
    124. Map subtype1 = new HashMap<>();
    125. subtype1.put("OS.getName()", OS.getName());
    126. subtype1.put("OS.getPatchLevel()", OS.getPatchLevel());
    127. result.put("操作系统类型", subtype1);
    128. // 操作系统类型
    129. // 操作系统的卖主
    130. result.put("操作系统的卖主", OS.getVendor());
    131. // 卖主名称
    132. result.put("卖主名称", OS.getVendorCodeName());
    133. // 操作系统名称
    134. result.put("操作系统名称", OS.getVendorName());
    135. // 操作系统卖主类型
    136. result.put("操作系统卖主类型", OS.getVendorVersion());
    137. // 操作系统的版本号
    138. result.put("操作系统的版本号", OS.getVersion());
    139. return result;
    140. }
    141. // c)取当前系统进程表中的用户信息
    142. public List testWho() {
    143. List result = new ArrayList<>();
    144. try {
    145. Sigar sigar = new Sigar();
    146. org.hyperic.sigar.Who[] who = sigar.getWhoList();
    147. if (who != null && who.length > 0) {
    148. for (int i = 0; i < who.length; i++) {
    149. Map subtype = new HashMap<>();
    150. System.out.println("\n~~~~~~~~~" + String.valueOf(i) + "~~~~~~~~~");
    151. org.hyperic.sigar.Who _who = who[i];
    152. subtype.put("getDevice", _who.getDevice());
    153. subtype.put("getHost", _who.getHost());
    154. subtype.put("getTime", _who.getTime());
    155. subtype.put("getUser", _who.getUser());
    156. // 当前系统进程表中的用户名
    157. result.add(subtype);
    158. }
    159. }
    160. } catch (SigarException e) {
    161. e.printStackTrace();
    162. }
    163. return result;
    164. }
    165. }
    166. 控制层进行调用

      1. @Autowired
      2. private SysInfo sysInfo;
      3. @ResponseBody
      4. @RequestMapping("5")
      5. public Map<String, Object> test5() throws SigarException {
      6. Map<String, Object> result = new HashMap<>();
      7. result.put("CPU数量", sysInfo.getCpuCount());
      8. result.put("CPU的相关信息(单位HZ)", sysInfo.getCpuTotal());
      9. result.put("CPU的用户使用量(单位100%)", sysInfo.testCpuPerc());
      10. result.put("物理内存信息", sysInfo.getPhysicalMemory());
      11. result.put("操作系统名称", sysInfo.getPlatformName());
      12. result.put("取当前操作系统的信息", sysInfo.testGetOSInfo());
      13. result.put(" 取当前系统进程表中的用户信息", sysInfo.testWho());
      14. return result;
      15. }

      相应结果

       这样就可以获取到该服务器的基本的信息

      延伸:如果想做一些自己的服务器的监控,又不想用开源的一些信息,可以使用sigar来进行开发;当然,这个也可以进行进一步的优化:

      (1)开发成可视化界面

      (2)信息进行持久化

      (3)探针文件自动上传不同的服务器

      后面有时间将继续优化功能。

    167. 相关阅读:
      Vue渐进式框架
      Java如何用EasyExcel插件对Excel进行数据导入和数据导出
      Unity vscode 官方debug
      nodejs的express负载均衡(续)
      Leetcode 42.接雨水
      CentOS7上从0开始搭建Zookeeper集群
      趋势分析是什么?市场趋势分析的经典方法,从数据中识别机会
      刷题学习记录
      【代码扫描修复】MD5加密弱HASH漏洞
      我问老大:TCP 四次挥手,可以变成三次吗?
    168. 原文地址:https://blog.csdn.net/weixin_40593587/article/details/126174408