• 欢迎访问本网站,技术教程,资源分享,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入东蓬莱!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏东部蓬莱吧

Java使用Sigar获取系统参数

后台开发 Jokul 11个月前 (07-28) 427次浏览 0个评论 扫描二维码

一、配置

Windows:

系统是64位则把sigar-amd64-winnt.dll添加到C:\Windows\System32
系统是32位则把sigar-x86-winnt.dll添加到C:\Windows\System32
项目引用 sigar.jar 这个jar包

Linux:

把libsigar-amd64-Linux.so(64bit)或libsigar-x86-linux.so(32bit)
添加到/usr/lib64或者/lib64或者/lib或者/usr/lib,只需放其中一个目录
比如:
服务器为64位配置文件放到/usr/lib64目录下:

cp -rf /usr/local/install/libsigar-amd64-linux.so /usr/lib64/

服务器为32位配置文件放到/usr/lib64目录下:

cp -rf /usr/local/install/libsigar-x86-linux.so /usr/lib64/

更改后继续下面的操作到启动项目后,登录系统查看,若系统管理部分的系统参数无数据,则重启服务器。

二、调用部分实例

1、获取系统CPU信息

import java.util.Properties;

import org.hyperic.sigar.CpuInfo;
import org.hyperic.sigar.CpuPerc;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;

public class SigarGetCPU {
    public static void main(String[] args) throws SigarException {
        Properties props = System.getProperties();
        String systemName = props.getProperty("os.name");
        // 使用sigar获取CPU信息及内存
        Sigar sigar = new Sigar();
        // 获取CPU信息
        CpuInfo[] infos = sigar.getCpuInfoList();
        CpuInfo infoss = infos[0];
        CpuPerc cpu = sigar.getCpuPerc();
        // CPU总数
        Integer totalCPUs = infoss.getTotalCores();
        String cpuinfo = infoss.getVendor() + "  " + infoss.getModel();
        // 获取CPU基准速度
        double referenceSpeed = infoss.getMhz();
        String referenceSpeeds = String.format("%.2f", referenceSpeed / 1000) + " GHz";
        // 获取CPU用户利用率
        double userUsedPerc = cpu.getUser();
        // 获取CPU系统利用率
        double sysUsedPerc = cpu.getSys();
        // 获取CPU利用率
        double cpuUsedPerc = cpu.getCombined();
        String userPers =  "";
        String sysPers =  "";
        String cpuPers = "";
        if(systemName.startsWith("win") || systemName.startsWith("Win")) {
            //Windows系统 Perc * 100 
            userPers = String.format("%.1f", userUsedPerc * 100) + "%";
            sysPers = String.format("%.1f", sysUsedPerc * 100) + "%";
            cpuPers = String.format("%.1f", cpuUsedPerc * 100) + "%";
        }else {
            //Linux系统 Perc * 1000 
            cpuPers = String.format("%.1f", cpuUsedPerc * 1000) + "%";
            sysPers = String.format("%.1f", sysUsedPerc * 1000) + "%";
            userPers = String.format("%.1f", userUsedPerc * 1000) + "%";
        }      
        System.out.println("CPU======="+cpuinfo);
        System.out.println("CPU总数======="+totalCPUs);
        System.out.println("CPU基准速度======="+referenceSpeeds);
        System.out.println("CPU用户利用率======="+userPers);
        System.out.println("CPU系统利用率======="+sysPers);
        System.out.println("CPU利用率======="+cpuPers);
        // 关闭sigar
        sigar.close();
    }
}

2、获取系统内存信息

import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;

public class SigarGetMen {
    public static void main(String[] args) throws SigarException {
        // 使用sigar获取CPU信息及内存
        Sigar sigar = new Sigar();
        double memTotal = sigar.getMem().getTotal();
        double memRam = sigar.getMem().getRam();
        double memUsed = sigar.getMem().getActualUsed();// mem
        double memFree = sigar.getMem().getActualFree();
        double memUsedPerc = sigar.getMem().getUsedPercent();
        String memory = String.format("%.0f", memTotal / 1024 / 1024 / 1024) + " GB";
        String memRamStr = String.format("%.1f", memRam / 1024) + " GB";
        String memused = String.format("%.2f", memUsed / 1024 / 1024 / 1024) + " GB";
        String memFrees = String.format("%.2f", memFree / 1024 / 1024 / 1024) + " GB";
        String memoryUsage = String.format("%.2f", memUsedPerc) + " %";        
        System.out.println("内存======="+memory);
        System.out.println("内存使用量======="+memRamStr);
        System.out.println("使用中======="+memused);
        System.out.println("可用======="+memFrees);
        System.out.println("内存使用率======="+memoryUsage);        
        // 关闭sigar
        sigar.close();
    }
}

3、获取系统磁盘信息

import java.util.Arrays;
import java.util.List;

import org.hyperic.sigar.FileSystem;
import org.hyperic.sigar.FileSystemUsage;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;

public class SigarGetDisk {
    public static void main(String[] args) throws InterruptedException, SigarException {
        Sigar sigar = new Sigar();
        FileSystemUsage sfileSystemUsage = null;
        FileSystemUsage efileSystemUsage = null;
        List<FileSystem> list = Arrays.asList(sigar.getFileSystemList());
        String diskName = "";
        double total = 0;
        double usePercent = 0;
        double startreads = 0;
        double startwrites = 0;      
        double endreads = 0;
        double endwrites = 0;     
        double reads = 0;
        double writes = 0;
        long start = System.currentTimeMillis();
        for (int i = 0; i < list.size(); i++) {
            diskName += list.get(i);
            try {
                sfileSystemUsage = sigar.getFileSystemUsage(String.valueOf(list.get(i)));
            } catch (SigarException e) {// 当fileSystem.getType()为5时会出现该异常——此时文件系统类型为光驱
                continue;
            }
            total += sfileSystemUsage.getTotal();
            usePercent += sfileSystemUsage.getUsePercent();                 
            startreads += sfileSystemUsage.getDiskReads();
            startwrites += sfileSystemUsage.getDiskWrites();
        }
         Thread.sleep(1000);
         long end = System.currentTimeMillis();
         for (int i = 0; i < list.size(); i++) {
                try {
                    efileSystemUsage = sigar.getFileSystemUsage(String.valueOf(list.get(i)));
                } catch (SigarException e) {// 当fileSystem.getType()为5时会出现该异常——此时文件系统类型为光驱
                    continue;
                }                  
                endreads += efileSystemUsage.getDiskReads();
                endwrites += efileSystemUsage.getDiskWrites();
            }
         reads = ((endreads - startreads)*8/(end-start)*1000);
         writes = ((endwrites - startwrites)*8/(end-start)*1000);
        // 读
        String readss = String.format("%.1f", reads) + " KB/s";
        // 写
        String writess = String.format("%.1f", writes) + " KB/s";
        // 磁盘容量
        String totals="";
        if(total / 1024 / 1024 / 1024>1) { 
             totals = String.format("%.1f", total / 1024 / 1024 / 1024) + " TB";
        }else if(total / 1024 / 1024>1){
             totals = String.format("%.1f", total / 1024 / 1024) + " GB";
        }else if(total / 1024>1) {    
             totals = String.format("%.1f", total / 1024) + " MB";
        }else if(total <=1) {
            totals = String.format("%.1f", total) + " KB";
        }
        // 磁盘使用率
        String usePercents = String.format("%.2f", usePercent * 100) + " %";
        System.out.println("磁盘名======="+diskName);
        System.out.println("总容量======="+totals);
        System.out.println("磁盘使用率======="+usePercents);
        System.out.println("读取速度======="+readss);
        System.out.println("写入速度======="+writess);
        // 关闭sigar
        sigar.close();
    }
}

4、获取系统网络信息

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;

import org.hyperic.sigar.NetInterfaceConfig;
import org.hyperic.sigar.NetInterfaceStat;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;

public class SigarGetNet {
   public static void main(String[] args) throws SigarException, InterruptedException {
        Sigar sigar = new Sigar();
         String ip = "";
            try {
                for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
                    NetworkInterface intf = en.nextElement();
                    String name = intf.getName();
                    if (!name.contains("docker") && !name.contains("lo")) {
                        for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                            InetAddress inetAddress = enumIpAddr.nextElement();
                            if (!inetAddress.isLoopbackAddress()) {
                                String ipaddress = inetAddress.getHostAddress().toString();
                                if (!ipaddress.contains("::") && !ipaddress.contains("0:0:") && !ipaddress.contains("fe80")) {
                                    ip = ipaddress;
                                }
                            }
                        }
                    }
                }
            } catch (SocketException ex) {
                ip = "127.0.0.1";
                ex.printStackTrace();
            }          
        String[] netInterfaceList = sigar.getNetInterfaceList();
        double rxBytes = 0;
        double txBytes = 0;
        String description = null;
        // 一些其它的信息
        for (int i = 0; i < netInterfaceList.length; i++) {
            String netInterface = netInterfaceList[i];// 网络接口
            NetInterfaceConfig netInterfaceConfig = sigar.getNetInterfaceConfig(netInterface);      
             if (netInterfaceConfig.getAddress().equals(ip)) {  
                     description =  netInterfaceConfig.getDescription();
                     System.out.println("网卡描述信息 ======="+description);
                     double start = System.currentTimeMillis();
                    NetInterfaceStat statStart = sigar.getNetInterfaceStat(netInterface);
                    double rxBytesStart = statStart.getRxBytes();
                    double txBytesStart = statStart.getTxBytes();   
                    Thread.sleep(1000);
                    double end = System.currentTimeMillis();
                    NetInterfaceStat statEnd = sigar.getNetInterfaceStat(netInterface);
                    double rxBytesEnd = statEnd.getRxBytes();
                    double txBytesEnd = statEnd.getTxBytes();
                    rxBytes = ((rxBytesEnd - rxBytesStart)*8/(end-start)*1000)/1024;
                    txBytes = ((txBytesEnd - txBytesStart)*8/(end-start)*1000)/1024;             
                    break;
                }    
            // 判断网卡信息中是否包含VMware即虚拟机,不存在则设置为返回值
            //System.out.println("网卡MAC地址 ======="+netInterfaceConfig.getHwaddr());
        }
        // 接收字节
        String rxBytess;
        // 发送字节
        String txBytess;       
         if(rxBytes>1024) { 
             rxBytess = String.format("%.1f", rxBytes/1024)+" Mbps";
        }else {
            rxBytess = String.format("%.0f", rxBytes)+" Kbps";
        }
        if(txBytes>1024) {
            txBytess = String.format("%.1f", txBytes/1024)+" Mbps" ;
        }else {
            txBytess=String.format("%.0f", txBytes)+" Kbps";
        }      
        System.out.println("发送======="+rxBytess);
        System.out.println("接收======="+txBytess);
        System.out.println("IP======="+ip);        
        // 关闭sigar
        sigar.close();
    }
}

东部蓬莱 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Java使用Sigar获取系统参数
喜欢 (0)
[支付宝]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址