java如何实现系统监控、系统信息收集、sigar开源API的学习(转)
转自:http://liningjustsoso.iteye.com/blog/1254584首先给大家介绍一个开源工具Sigar?
官网:http://sigar.hyperic.com/?
API:http://www.hyperic.com/support/docs/sigar/index-all.html(由于是英文的,英文不好的可以用谷歌浏览器的翻译功能,直接转换为简体中文进行阅读)?
Sigar(System Information Gatherer And Reporter),是一个开源的工具,提供了跨平台的系统信息收集的API,由C语言实现的。可以收集的信息包括:?
1, CPU信息,包括基本信息(vendor、model、mhz、cacheSize)和统计信息(user、sys、idle、nice、wait)?
2, 文件系统信息,包括Filesystem、Size、Used、Avail、Use%、Type?
3, 事件信息,类似Service Control Manager?
4, 内存信息,物理内存和交换内存的总数、使用数、剩余数;RAM的大小?
5, 网络信息,包括网络接口信息和网络路由信息?
6, 进程信息,包括每个进程的内存、CPU占用数、状态、参数、句柄?
7, IO信息,包括IO的状态,读写大小等?
8, 服务状态信息?
9, 系统信息,包括操作系统版本,系统资源限制情况,系统运行时间以及负载,JAVA的版本信息等.?
Sigar在Java中的使用:?
开发时将附件中sigar.rar中的所有文件及jar包放在工程的lib文件夹下。?
Java代码??
- package?com.test_sigar;??
- ??
- import?java.net.InetAddress;??
- import?java.net.UnknownHostException;??
- import?java.text.DecimalFormat;??
- ??
- import?org.hyperic.sigar.CpuInfo;??
- import?org.hyperic.sigar.CpuPerc;??
- import?org.hyperic.sigar.FileSystem;??
- import?org.hyperic.sigar.FileSystemUsage;??
- import?org.hyperic.sigar.Mem;??
- import?org.hyperic.sigar.NetFlags;??
- import?org.hyperic.sigar.NetInterfaceConfig;??
- import?org.hyperic.sigar.NetInterfaceStat;??
- import?org.hyperic.sigar.OperatingSystem;??
- import?org.hyperic.sigar.Sigar;??
- import?org.hyperic.sigar.SigarException;??
- import?org.hyperic.sigar.SigarNotImplementedException;??
- import?org.hyperic.sigar.Swap;??
- ??
- public?class?SysInfo?{??
- ??
- ????public?static?void?main(String?[]?args)?throws?Exception{??
- ????????SysInfo?s?=new?SysInfo();??
- ????????System.out.println("CPU个数:"+s.getCpuCount());??
- ????????s.getCpuTotal();??
- ????????s.testCpuPerc();??
- ????????s.getPhysicalMemory();??
- ????????s.testWho();??
- ????????s.testFileSystemInfo();??
- ????????s.testGetOSInfo();??
- ????}??
- ????/**?
- ?????*?1.CPU资源信息?
- ?????*/??
- ??????
- ????//?a)CPU数量(单位:个)??
- ????public?static?int?getCpuCount()?throws?SigarException?{??
- ????????Sigar?sigar?=?new?Sigar();??
- ????????try?{??
- ????????????return?sigar.getCpuInfoList().length;??
- ????????}?finally?{??
- ????????????sigar.close();??
- ????????}??
- ????}??
- ??
- ????//?b)CPU的总量(单位:HZ)及CPU的相关信息??
- ????public?void?getCpuTotal()?{??
- ????????Sigar?sigar?=?new?Sigar();??
- ????????CpuInfo[]?infos;??
- ????????try?{??
- ????????????infos?=?sigar.getCpuInfoList();??
- ????????????for?(int?i?=?0;?i?<?infos.length;?i++)?{//?不管是单块CPU还是多CPU都适用??
- ????????????????CpuInfo?info?=?infos[i];??
- ????????????????System.out.println("CPU的总量:"?+?info.getMhz());//?CPU的总量MHz??
- ????????????????System.out.println("获得CPU的卖主:"?+?info.getVendor());//?获得CPU的卖主,如:Intel??
- ????????????????System.out.println("CPU的类别:"?+?info.getModel());//?获得CPU的类别,如:Celeron??
- ????????????????System.out.println("缓冲存储器数量:"?+?info.getCacheSize());//?缓冲存储器数量??
- ????????????????System.out.println("**************");??
- ????????????}??
- ????????}?catch?(SigarException?e)?{??
- ????????????e.printStackTrace();??
- ????????}??
- ????}??
- ??
- ????//?c)CPU的用户使用量、系统使用剩余量、总的剩余量、总的使用占用量等(单位:100%)??
- ????public?void?testCpuPerc()?{??
- ????????Sigar?sigar?=?new?Sigar();??
- ????????//?方式一,主要是针对一块CPU的情况??
- ????????CpuPerc?cpu;??
- ????????try?{??
- ????????????cpu?=?sigar.getCpuPerc();??
- ????????????printCpuPerc(cpu);??
- ????????}?catch?(SigarException?e)?{??
- ????????????e.printStackTrace();??
- ????????}??
- ????????//?方式二,不管是单块CPU还是多CPU都适用??
- ????????CpuPerc?cpuList[]?=?null;??
- ????????try?{??
- ????????????cpuList?=?sigar.getCpuPercList();??
- ????????}?catch?(SigarException?e)?{??
- ????????????e.printStackTrace();??
- ????????????return;??
- ????????}??
- ????????for?(int?i?=?0;?i?<?cpuList.length;?i++)?{??
- ????????????printCpuPerc(cpuList[i]);??
- ????????}??
- ????}??
- ??
- ????private?void?printCpuPerc(CpuPerc?cpu)?{??
- ????????System.out.println("用户使用率:"?+?CpuPerc.format(cpu.getUser()));//?用户使用率??
- ????????System.out.println("系统使用率:"?+?CpuPerc.format(cpu.getSys()));//?系统使用率??
- ????????System.out.println("当前等待率:"?+?CpuPerc.format(cpu.getWait()));//?当前等待率??
- ????????System.out.println("Nice?:"?+?CpuPerc.format(cpu.getNice()));//??
- ????????System.out.println("当前空闲率:"?+?CpuPerc.format(cpu.getIdle()));//?当前空闲率??
- ????????System.out.println("总的使用率:"?+?CpuPerc.format(cpu.getCombined()));//?总的使用率??
- ????????System.out.println("**************");??
- ????}??
- ??
- ????/**?
- ?????*?2.内存资源信息?
- ?????*?
- ?????*/??
- ??????
- ????public?void?getPhysicalMemory()?{??
- ????????//?a)物理内存信息??
- ????????DecimalFormat?df?=?new?DecimalFormat("#0.00");??
- ????????Sigar?sigar?=?new?Sigar();??
- ????????Mem?mem;??
- ????????try?{??
- ????????????mem?=?sigar.getMem();??
- ????????????//?内存总量??
- ????????????System.out.println("内存总量:"?+?df.format((float)mem.getTotal()?/?1024/1024/1024)?+?"G");??
- ????????????//?当前内存使用量??
- ????????????System.out.println("当前内存使用量:"?+?df.format((float)mem.getUsed()?/?1024/1024/1024)?+?"G");??
- ????????????//?当前内存剩余量??
- ????????????System.out.println("当前内存剩余量:"?+?df.format((float)mem.getFree()?/?1024/1024/1024)?+?"G");??
- ????????????//?b)系统页面文件交换区信息??
- ????????????Swap?swap?=?sigar.getSwap();??
- ????????????//?交换区总量??
- ????????????System.out.println("交换区总量:"?+?df.format((float)swap.getTotal()?/?1024/1024/1024)?+?"G");??
- ????????????//?当前交换区使用量??
- ????????????System.out.println("当前交换区使用量:"?+?df.format((float)swap.getUsed()?/?1024/1024/1024)?+?"G");??
- ????????????//?当前交换区剩余量??
- ????????????System.out.println("当前交换区剩余量:"?+?df.format((float)swap.getFree()?/?1024/1024/1024)?+?"G");??
- ????????}?catch?(SigarException?e)?{??
- ????????????e.printStackTrace();??
- ????????}??
- ????}??
- ??
- ????/**?
- ?????*?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?void?testGetOSInfo()?{??
- ????????OperatingSystem?OS?=?OperatingSystem.getInstance();??
- ????????//?操作系统内核类型如:?386、486、586等x86??
- ????????System.out.println("OS.getArch()?=?"?+?OS.getArch());??
- ????????System.out.println("OS.getCpuEndian()?=?"?+?OS.getCpuEndian());//??
- ????????System.out.println("OS.getDataModel()?=?"?+?OS.getDataModel());//??
- ????????//?系统描述??
- ????????System.out.println("OS.getDescription()?=?"?+?OS.getDescription());??
- ????????System.out.println("OS.getMachine()?=?"?+?OS.getMachine());//??
- ????????//?操作系统类型??
- ????????System.out.println("OS.getName()?=?"?+?OS.getName());??
- ????????System.out.println("OS.getPatchLevel()?=?"?+?OS.getPatchLevel());//??
- ????????//?操作系统的卖主??
- ????????System.out.println("OS.getVendor()?=?"?+?OS.getVendor());??
- ????????//?卖主名称??
- ????????System.out??
- ????????????????.println("OS.getVendorCodeName()?=?"?+?OS.getVendorCodeName());??
- ????????//?操作系统名称??
- ????????System.out.println("OS.getVendorName()?=?"?+?OS.getVendorName());??
- ????????//?操作系统卖主类型??
- ????????System.out.println("OS.getVendorVersion()?=?"?+?OS.getVendorVersion());??
- ????????//?操作系统的版本号??
- ????????System.out.println("OS.getVersion()?=?"?+?OS.getVersion());??
- ????}??
- ??
- ????//?c)取当前系统进程表中的用户信息??
- ????public?void?testWho()?{??
- ????????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++)?{??
- ????????????????????System.out.println("\n~~~~~~~~~"?+?String.valueOf(i)??
- ????????????????????????????+?"~~~~~~~~~");??
- ????????????????????org.hyperic.sigar.Who?_who?=?who[i];??
- ????????????????????System.out.println("获取设备getDevice()?=?"?+?_who.getDevice());??
- ????????????????????System.out.println("获得主机getHost()?=?"?+?_who.getHost());??
- ????????????????????System.out.println("获取的时间getTime()?=?"?+?_who.getTime());??
- ????????????????????//?当前系统进程表中的用户名??
- ????????????????????System.out.println("获取用户getUser()?=?"?+?_who.getUser());??
- ????????????????}??
- ????????????}??
- ????????}?catch?(SigarException?e)?{??
- ????????????e.printStackTrace();??
- ????????}??
- ????}??
- ??
- ????//?4.资源信息(主要是硬盘)??
- ????//?a)取硬盘已有的分区及其详细信息(通过sigar.getFileSystemList()来获得FileSystem列表对象,然后对其进行编历):??
- ????public?void?testFileSystemInfo()?throws?Exception?{??
- ????????Sigar?sigar?=?new?Sigar();??
- ????????FileSystem?fslist[]?=?sigar.getFileSystemList();??
- ????????DecimalFormat?df?=?new?DecimalFormat("#0.00");??
- ????????//?String?dir?=?System.getProperty("user.home");//?当前用户文件夹路径??
- ????????for?(int?i?=?0;?i?<?fslist.length;?i++)?{??
- ????????????System.out.println("\n~~~~~~~~~~"?+?i?+?"~~~~~~~~~~");??
- ????????????FileSystem?fs?=?fslist[i];??
- ????????????//?分区的盘符名称??
- ????????????System.out.println("fs.getDevName()?=?"?+?fs.getDevName());??
- ????????????//?分区的盘符名称??
- ????????????System.out.println("fs.getDirName()?=?"?+?fs.getDirName());??
- ????????????System.out.println("fs.getFlags()?=?"?+?fs.getFlags());//??
- ????????????//?文件系统类型,比如?FAT32、NTFS??
- ????????????System.out.println("fs.getSysTypeName()?=?"?+?fs.getSysTypeName());??
- ????????????//?文件系统类型名,比如本地硬盘、光驱、网络文件系统等??
- ????????????System.out.println("fs.getTypeName()?=?"?+?fs.getTypeName());??
- ????????????//?文件系统类型??
- ????????????System.out.println("fs.getType()?=?"?+?fs.getType());??
- ????????????FileSystemUsage?usage?=?null;??
- ????????????try?{??
- ????????????????usage?=?sigar.getFileSystemUsage(fs.getDirName());??
- ????????????}?catch?(SigarException?e)?{??
- ????????????????if?(fs.getType()?==?2)??
- ????????????????????throw?e;??
- ????????????????continue;??
- ????????????}??
- ????????????switch?(fs.getType())?{??
- ????????????case?0:?//?TYPE_UNKNOWN?:未知??
- ????????????????break;??
- ????????????case?1:?//?TYPE_NONE??
- ????????????????break;??
- ????????????case?2:?//?TYPE_LOCAL_DISK?:?本地硬盘??
- ????????????????//?文件系统总大小??
- ????????????????System.out.println("?Total?=?"?+?df.format((float)usage.getTotal()/1024/1024)?+?"G");??
- ????????????????//?文件系统剩余大小??
- ????????????????System.out.println("?Free?=?"?+?df.format((float)usage.getFree()/1024/1024)?+?"G");??
- ????????????????//?文件系统可用大小??
- ????????????????System.out.println("?Avail?=?"?+?df.format((float)usage.getAvail()/1024/1024)?+?"G");??
- ????????????????//?文件系统已经使用量??
- ????????????????System.out.println("?Used?=?"?+?df.format((float)usage.getUsed()/1024/1024)?+?"G");??
- ????????????????double?usePercent?=?usage.getUsePercent()?*?100D;??
- ????????????????//?文件系统资源的利用率??
- ????????????????System.out.println("?Usage?=?"?+?df.format(usePercent)?+?"%");??
- ????????????????break;??
- ????????????case?3://?TYPE_NETWORK?:网络??
- ????????????????break;??
- ????????????case?4://?TYPE_RAM_DISK?:闪存??
- ????????????????break;??
- ????????????case?5://?TYPE_CDROM?:光驱??
- ????????????????break;??
- ????????????case?6://?TYPE_SWAP?:页面交换??
- ????????????????break;??
- ????????????}??
- ????????????System.out.println("?DiskReads?=?"?+?usage.getDiskReads());??
- ????????????System.out.println("?DiskWrites?=?"?+?usage.getDiskWrites());??
- ????????}??
- ????????return;??
- ????}??
- ??
- ????//?5.网络信息??
- ????//?a)当前机器的正式域名??
- ????public?String?getFQDN()?{??
- ????????Sigar?sigar?=?null;??
- ????????try?{??
- ????????????return?InetAddress.getLocalHost().getCanonicalHostName();??
- ????????}?catch?(UnknownHostException?e)?{??
- ????????????try?{??
- ????????????????sigar?=?new?Sigar();??
- ????????????????return?sigar.getFQDN();??
- ????????????}?catch?(SigarException?ex)?{??
- ????????????????return?null;??
- ????????????}?finally?{??
- ????????????????sigar.close();??
- ????????????}??
- ????????}??
- ????}??
- ??
- ????//?b)取到当前机器的IP地址??
- ????public?String?getDefaultIpAddress()?{??
- ????????String?address?=?null;??
- ????????try?{??
- ????????????address?=?InetAddress.getLocalHost().getHostAddress();??
- ????????????//?没有出现异常而正常当取到的IP时,如果取到的不是网卡循回地址时就返回??
- ????????????//?否则再通过Sigar工具包中的方法来获取??
- ????????????if?(!NetFlags.LOOPBACK_ADDRESS.equals(address))?{??
- ????????????????return?address;??
- ????????????}??
- ????????}?catch?(UnknownHostException?e)?{??
- ????????????//?hostname?not?in?DNS?or?/etc/hosts??
- ????????}??
- ????????Sigar?sigar?=?new?Sigar();??
- ????????try?{??
- ????????????address?=?sigar.getNetInterfaceConfig().getAddress();??
- ????????}?catch?(SigarException?e)?{??
- ????????????address?=?NetFlags.LOOPBACK_ADDRESS;??
- ????????}?finally?{??
- ????????????sigar.close();??
- ????????}??
- ????????return?address;??
- ????}??
- ??
- ????//?c)取到当前机器的MAC地址??
- ????public?String?getMAC()?{??
- ????????Sigar?sigar?=?null;??
- ????????try?{??
- ????????????sigar?=?new?Sigar();??
- ????????????String[]?ifaces?=?sigar.getNetInterfaceList();??
- ????????????String?hwaddr?=?null;??
- ????????????for?(int?i?=?0;?i?<?ifaces.length;?i++)?{??
- ????????????????NetInterfaceConfig?cfg?=?sigar.getNetInterfaceConfig(ifaces[i]);??
- ????????????????if?(NetFlags.LOOPBACK_ADDRESS.equals(cfg.getAddress())??
- ????????????????????????||?(cfg.getFlags()?&?NetFlags.IFF_LOOPBACK)?!=?0??
- ????????????????????????||?NetFlags.NULL_HWADDR.equals(cfg.getHwaddr()))?{??
- ????????????????????continue;??
- ????????????????}??
- ????????????????/*?
- ?????????????????*?如果存在多张网卡包括虚拟机的网卡,默认只取第一张网卡的MAC地址,如果要返回所有的网卡(包括物理的和虚拟的)则可以修改方法的返回类型为数组或Collection?
- ?????????????????*?,通过在for循环里取到的多个MAC地址。?
- ?????????????????*/??
- ????????????????hwaddr?=?cfg.getHwaddr();??
- ????????????????break;??
- ????????????}??
- ????????????return?hwaddr?!=?null???hwaddr?:?null;??
- ????????}?catch?(Exception?e)?{??
- ????????????return?null;??
- ????????}?finally?{??
- ????????????if?(sigar?!=?null)??
- ????????????????sigar.close();??
- ????????}??
- ????}??
- ??
- ????//?d)获取网络流量等信息??
- ????public?void?testNetIfList()?throws?Exception?{??
- ????????Sigar?sigar?=?new?Sigar();??
- ????????String?ifNames[]?=?sigar.getNetInterfaceList();??
- ????????for?(int?i?=?0;?i?<?ifNames.length;?i++)?{??
- ????????????String?name?=?ifNames[i];??
- ????????????NetInterfaceConfig?ifconfig?=?sigar.getNetInterfaceConfig(name);??
- ????????????print("\nname?=?"?+?name);//?网络设备名??
- ????????????print("Address?=?"?+?ifconfig.getAddress());//?IP地址??
- ????????????print("Netmask?=?"?+?ifconfig.getNetmask());//?子网掩码??
- ????????????if?((ifconfig.getFlags()?&?1L)?<=?0L)?{??
- ????????????????print("!IFF_UP...skipping?getNetInterfaceStat");??
- ????????????????continue;??
- ????????????}??
- ????????????try?{??
- ????????????????NetInterfaceStat?ifstat?=?sigar.getNetInterfaceStat(name);??
- ????????????????print("RxPackets?=?"?+?ifstat.getRxPackets());//?接收的总包裹数??
- ????????????????print("TxPackets?=?"?+?ifstat.getTxPackets());//?发送的总包裹数??
- ????????????????print("RxBytes?=?"?+?ifstat.getRxBytes());//?接收到的总字节数??
- ????????????????print("TxBytes?=?"?+?ifstat.getTxBytes());//?发送的总字节数??
- ????????????????print("RxErrors?=?"?+?ifstat.getRxErrors());//?接收到的错误包数??
- ????????????????print("TxErrors?=?"?+?ifstat.getTxErrors());//?发送数据包时的错误数??
- ????????????????print("RxDropped?=?"?+?ifstat.getRxDropped());//?接收时丢弃的包数??
- ????????????????print("TxDropped?=?"?+?ifstat.getTxDropped());//?发送时丢弃的包数??
- ????????????}?catch?(SigarNotImplementedException?e)?{??
- ????????????}?catch?(SigarException?e)?{??
- ????????????????print(e.getMessage());??
- ????????????}??
- ????????}??
- ????}??
- ??
- ????void?print(String?msg)?{??
- ????????System.out.println(msg);??
- ????}??
- ??
- ????//?e)一些其他的信息??
- ????public?void?getEthernetInfo()?{??
- ????????Sigar?sigar?=?null;??
- ????????try?{??
- ????????????sigar?=?new?Sigar();??
- ????????????String[]?ifaces?=?sigar.getNetInterfaceList();??
- ????????????for?(int?i?=?0;?i?<?ifaces.length;?i++)?{??
- ????????????????NetInterfaceConfig?cfg?=?sigar.getNetInterfaceConfig(ifaces[i]);??
- ????????????????if?(NetFlags.LOOPBACK_ADDRESS.equals(cfg.getAddress())??
- ????????????????????????||?(cfg.getFlags()?&?NetFlags.IFF_LOOPBACK)?!=?0??
- ????????????????????????||?NetFlags.NULL_HWADDR.equals(cfg.getHwaddr()))?{??
- ????????????????????continue;??
- ????????????????}??
- ????????????????System.out.println("cfg.getAddress()?=?"?+?cfg.getAddress());//?IP地址??
- ????????????????System.out??
- ????????????????????????.println("cfg.getBroadcast()?=?"?+?cfg.getBroadcast());//?网关广播地址??
- ????????????????System.out.println("cfg.getHwaddr()?=?"?+?cfg.getHwaddr());//?网卡MAC地址??
- ????????????????System.out.println("cfg.getNetmask()?=?"?+?cfg.getNetmask());//?子网掩码??
- ????????????????System.out.println("cfg.getDescription()?=?"??
- ????????????????????????+?cfg.getDescription());//?网卡描述信息??
- ????????????????System.out.println("cfg.getType()?=?"?+?cfg.getType());//??
- ????????????????System.out.println("cfg.getDestination()?=?"??
- ????????????????????????+?cfg.getDestination());??
- ????????????????System.out.println("cfg.getFlags()?=?"?+?cfg.getFlags());//??
- ????????????????System.out.println("cfg.getMetric()?=?"?+?cfg.getMetric());??
- ????????????????System.out.println("cfg.getMtu()?=?"?+?cfg.getMtu());??
- ????????????????System.out.println("cfg.getName()?=?"?+?cfg.getName());??
- ????????????????System.out.println();??
- ????????????}??
- ????????}?catch?(Exception?e)?{??
- ????????????System.out.println("Error?while?creating?GUID"?+?e);??
- ????????}?finally?{??
- ????????????if?(sigar?!=?null)??
- ????????????????sigar.close();??
- ????????}??
- ????}??
- ??
- }??
- sigar.rar?(1.2 MB)
- 下载次数: 9<!--EndFragment--> 1 楼 plandu 2012-07-05 不错,我有个问题,怎么通过sigar获取CPU序列号、硬盘卷标号或序列号?
我知道windows可以通过File类创建vbs临时文件获取,但是Linux始终没有合适的方法。