码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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. 相关阅读:
      使用devcpp遇到的常见错误解决方法
      面试官:SpringBoot如何优雅停机?
      Java手写双向广度优先和双向广度优先应用拓展案例
      scartch考核标准
      操作系统期末知识点复习
      从零用VitePress搭建博客教程(7) -– 如何用Github Actions自动化部署到Github Pages?
      十.EtherCAT开发之microchip MCU D51+ LAN9253 的开发COE应用(SPI directly 模式)
      互联网职场人写周报的正确姿势
      【Pytest实战】Pytest 如何生成优美的测试报告(allure-pytest)
      Python环境安装参考(python解释器+Pycharm软件)
    168. 原文地址:https://blog.csdn.net/weixin_40593587/article/details/126174408
      • 最新文章
      • 攻防演习之三天拿下官网站群
        数据安全治理学习——前期安全规划和安全管理体系建设
        企业安全 | 企业内一次钓鱼演练准备过程
        内网渗透测试 | Kerberos协议及其部分攻击手法
        0day的产生 | 不懂代码的"代码审计"
        安装scrcpy-client模块av模块异常,环境问题解决方案
        leetcode hot100【LeetCode 279. 完全平方数】java实现
        OpenWrt下安装Mosquitto
        AnatoMask论文汇总
        【AI日记】24.11.01 LangChain、openai api和github copilot
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
      正则表达式工具 cron表达式工具 密码生成工具

      京公网安备 11010502049817号