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

在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.fusesource</groupId>
            <artifactId>sigar</artifactId>
            <version>1.6.4</version>
        </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<Map<String, Object>> getCpuTotal() {
        Sigar sigar = new Sigar();
        CpuInfo[] infos;
        List<Map<String, Object>> result = new ArrayList<>();
        try {
            infos = sigar.getCpuInfoList();
            for (int i = 0; i < infos.length; i++) {// 不管是单块CPU还是多CPU都适用
                CpuInfo info = infos[i];
                Map<String, Object> 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<Map<String, Object>> testCpuPerc() {
        Sigar sigar = new Sigar();
        // 方式一,主要是针对一块CPU的情况
        CpuPerc cpu;

        List<Map<String, Object>> result = new ArrayList<>();
        // 方式二,不管是单块CPU还是多CPU都适用
        CpuPerc cpuList[] = null;
        try {
            cpuList = sigar.getCpuPercList();
        } catch (SigarException e) {
            e.printStackTrace();
        }
        for (int i = 0; i < cpuList.length; i++) {
            Map<String, Object> 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<String, Object> getPhysicalMemory() {
        // a)物理内存信息
        Sigar sigar = new Sigar();
        Mem mem;
        Map<String, Object> 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<String, Object> testGetOSInfo() {
        OperatingSystem OS = OperatingSystem.getInstance();
        // 操作系统内核类型如: 386、486、586等x86
        Map<String, Object> result = new HashMap<>();
        Map<String, Object> 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<String, Object> subdesc = new HashMap<>();
        subdesc.put("OS.getDescription()", OS.getDescription());
        subdesc.put("OS.getMachine()", OS.getMachine());
        result.put("系统描述", subdesc);
        Map<String, Object> 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<Object> testWho() {
        List<Object> result = new ArrayList<>();

        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<String, Object> 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;
    }

相应结果

Java里面有sntp服务器吗 java sip服务器_java

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

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

(1)开发成可视化界面

(2)信息进行持久化

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

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