如果我们想要获取服务器的一些基本信息,我们需要如何操作呢?
在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文件引入:
- <dependency>
- <groupId>org.fusesourcegroupId>
- <artifactId>sigarartifactId>
- <version>1.6.4version>
- dependency>
开发工具类
- import org.hyperic.sigar.*;
- import org.springframework.stereotype.Component;
-
- import java.net.InetAddress;
- import java.net.UnknownHostException;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
-
- @Component
- public class SysInfo {
- // 1.CPU资源信息
- // a)CPU数量(单位:个)
- public int getCpuCount() throws SigarException {
- Sigar sigar = new Sigar();
- try {
- return sigar.getCpuInfoList().length;
- } finally {
- sigar.close();
- }
- } // b)CPU的总量(单位:HZ)及CPU的相关信息
-
- public List
- Sigar sigar = new Sigar();
- CpuInfo[] infos;
- List
- try {
- infos = sigar.getCpuInfoList();
- for (int i = 0; i < infos.length; i++) {// 不管是单块CPU还是多CPU都适用
- CpuInfo info = infos[i];
- Map
map = new HashMap<>(16); - map.put("CPU的总量MHz", info.getMhz());
- map.put("获得CPU的卖主", info.getVendor());
- map.put("获得CPU的类别", info.getModel());
- map.put("缓冲存储器数量", info.getCacheSize());
- result.add(map);
-
- }
- } catch (SigarException e) {
- e.printStackTrace();
- }
- return result;
- } // c)CPU的用户使用量、系统使用剩余量、总的剩余量、总的使用占用量等(单位:100%)
-
- public List
- Sigar sigar = new Sigar();
- // 方式一,主要是针对一块CPU的情况
- CpuPerc cpu;
-
- List
- // 方式二,不管是单块CPU还是多CPU都适用
- CpuPerc cpuList[] = null;
- try {
- cpuList = sigar.getCpuPercList();
- } catch (SigarException e) {
- e.printStackTrace();
- }
- for (int i = 0; i < cpuList.length; i++) {
- Map
map = new HashMap<>(16); - map.put("用户使用率", CpuPerc.format(cpuList[i].getUser()));
- map.put("系统使用率", CpuPerc.format(cpuList[i].getSys()));
- map.put("当前等待率", CpuPerc.format(cpuList[i].getWait()));
- map.put("getNice", CpuPerc.format(cpuList[i].getNice()));
- map.put("当前空闲率", CpuPerc.format(cpuList[i].getIdle()));
- map.put("总的使用率", CpuPerc.format(cpuList[i].getCombined()));
- result.add(map);
- }
- return result;
- }
-
-
- public Map
getPhysicalMemory() { - // a)物理内存信息
- Sigar sigar = new Sigar();
- Mem mem;
- Map
map = new HashMap<>(16); - try {
- mem = sigar.getMem();
- // 内存总量
- map.put("内存总量", mem.getTotal() / 1024L + "K av");
- // 当前内存使用量
- // 当前内存剩余量
- map.put("当前内存剩余量", mem.getFree() / 1024L + "K free");
- // b)系统页面文件交换区信息
- Swap swap = sigar.getSwap();
- // 交换区总量
- map.put("交换区总量", swap.getTotal() / 1024L + "K av");
- // 当前交换区使用量
- map.put("当前交换区使用量", swap.getUsed() / 1024L + "K used");
- // 当前交换区剩余量
- map.put("当前交换区剩余量", swap.getFree() / 1024L + "K free");
- } catch (SigarException e) {
- e.printStackTrace();
- }
- return map;
- }
- // 3.操作系统信息
- // a)取到当前操作系统的名称:
-
- public String getPlatformName() {
- String hostname = "";
- try {
- hostname = InetAddress.getLocalHost().getHostName();
- } catch (Exception exc) {
- Sigar sigar = new Sigar();
- try {
- hostname = sigar.getNetInfo().getHostName();
- } catch (SigarException e) {
- hostname = "localhost.unknown";
- } finally {
- sigar.close();
- }
- }
- return hostname;
- } // b)取当前操作系统的信息
-
- public Map
testGetOSInfo() { - OperatingSystem OS = OperatingSystem.getInstance();
- // 操作系统内核类型如: 386、486、586等x86
- Map
result = new HashMap<>(); - Map
subtype = new HashMap<>(); - subtype.put("OS.getArch()", OS.getArch());
- subtype.put("OS.getCpuEndian()", OS.getCpuEndian());
- subtype.put("OS.getDataModel()", OS.getDataModel());
- subtype.put("OS.getCpuEndian()", OS.getCpuEndian());
- subtype.put("OS.getDataModel()", OS.getDataModel());
- result.put("操作系统内核类型", subtype);
- // 系统描述
- Map
subdesc = new HashMap<>(); - subdesc.put("OS.getDescription()", OS.getDescription());
- subdesc.put("OS.getMachine()", OS.getMachine());
- result.put("系统描述", subdesc);
- Map
subtype1 = new HashMap<>(); - subtype1.put("OS.getName()", OS.getName());
- subtype1.put("OS.getPatchLevel()", OS.getPatchLevel());
- result.put("操作系统类型", subtype1);
- // 操作系统类型
- // 操作系统的卖主
- result.put("操作系统的卖主", OS.getVendor());
- // 卖主名称
- result.put("卖主名称", OS.getVendorCodeName());
- // 操作系统名称
- result.put("操作系统名称", OS.getVendorName());
- // 操作系统卖主类型
- result.put("操作系统卖主类型", OS.getVendorVersion());
- // 操作系统的版本号
- result.put("操作系统的版本号", OS.getVersion());
- return result;
- }
- // c)取当前系统进程表中的用户信息
-
- public List
- List
-
- try {
- Sigar sigar = new Sigar();
- org.hyperic.sigar.Who[] who = sigar.getWhoList();
- if (who != null && who.length > 0) {
- for (int i = 0; i < who.length; i++) {
- Map
subtype = new HashMap<>(); - System.out.println("\n~~~~~~~~~" + String.valueOf(i) + "~~~~~~~~~");
- org.hyperic.sigar.Who _who = who[i];
- subtype.put("getDevice", _who.getDevice());
- subtype.put("getHost", _who.getHost());
- subtype.put("getTime", _who.getTime());
- subtype.put("getUser", _who.getUser());
- // 当前系统进程表中的用户名
- result.add(subtype);
- }
- }
- } catch (SigarException e) {
- e.printStackTrace();
- }
- return result;
- }
- }
控制层进行调用
- @Autowired
- private SysInfo sysInfo;
-
-
- @ResponseBody
- @RequestMapping("5")
- public Map<String, Object> test5() throws SigarException {
- Map<String, Object> result = new HashMap<>();
- result.put("CPU数量", sysInfo.getCpuCount());
- result.put("CPU的相关信息(单位HZ)", sysInfo.getCpuTotal());
- result.put("CPU的用户使用量(单位100%)", sysInfo.testCpuPerc());
- result.put("物理内存信息", sysInfo.getPhysicalMemory());
- result.put("操作系统名称", sysInfo.getPlatformName());
- result.put("取当前操作系统的信息", sysInfo.testGetOSInfo());
- result.put(" 取当前系统进程表中的用户信息", sysInfo.testWho());
- return result;
- }
相应结果
这样就可以获取到该服务器的基本的信息
延伸:如果想做一些自己的服务器的监控,又不想用开源的一些信息,可以使用sigar来进行开发;当然,这个也可以进行进一步的优化:
(1)开发成可视化界面
(2)信息进行持久化
(3)探针文件自动上传不同的服务器
后面有时间将继续优化功能。