Sigar介绍与使用

Sigar是Hyperic-hq产品的基础包,是Hyperic HQ主要的数据收集组件。它用来从许多平台收集系统和处理信息.

这些平台包括:Linux, Windows, Solaris, AIX, HP-UX, FreeBSD and Mac OSX.

Sigar有C,C#,Java和Perl API,java版的API为sigar.jar sigar.jar的底层是用C语言编写的,它通过本地方法来调用操作系统API来获取系统相关数据。

注意:Sigar为不同平台提供了不同的库文件.典型的:

windows平台:sigar-x86-winnt.dll

linux平台:libsigar-x86-linux.so或

solaris平台: libsigar-x86-solaris.so或libsigar-sparc-solaris.so或libsigar-sparc64-solaris.so

64位平台:分为至强的libsigar-ia64-linux.so和AMD的libsigar-amd64-linux.so,sigar-amd64-winnt.dll

Hyperic-hq官方网站:http://www.hyperic.com

Sigar.jar下载地址:http://sigar.hyperic.com

备用下载地址:点击下载

Sigar API 提供一个方便的接口来收集系统信息,如:

◆系统内存,页面交换,cpu,平均负载,运行时间,登录信息

◆每个进程占用的内存,cpu,帐号信息,状态,参数,环境,打开的文件

◆文件系统探测和度量

◆网络接口探测,配置信息和度量

◆网络路由和连接表

获取cpu信息代码

获取cpu信息代码

// CPU数量(单位:个)

int cpuLength = sigar.getCpuInfoList().length;

print(cpuLength);


// CPU的总量(单位:HZ)及CPU的相关信息

CpuInfo infos[] = sigar.getCpuInfoList();

for (int i = 0; i < infos.length; i++) {// 不管是单块CPU还是多CPU都适用

    CpuInfo info = infos[i];

    print("mhz=" + info.getMhz());// CPU的总量MHz

    print("vendor=" + info.getVendor());// 获得CPU的卖主,如:Intel

    print("model=" + info.getModel());// 获得CPU的类别,如:Celeron

    print("cache size=" + info.getCacheSize());// 缓冲存储器数量

}


/** CPU的用户使用量、系统使用剩余量、总的剩余量、总的使用占用量等(单位:100%) **/

// 方式一,主要是针对一块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();

}

for (int i = 0; i < cpuList.length; i++) {

    // printCpuPerc(cpuList[i]);

}

获取内存信息代码

// 物理内存信息

Mem mem = sigar.getMem();

// 内存总量

print("Total = " + mem.getTotal() / 1024L / 1024 + "M av");

// 当前内存使用量

print("Used = " + mem.getUsed() / 1024L / 1024 + "M used");

// 当前内存剩余量

print("Free = " + mem.getFree() / 1024L / 1024 + "M free");


// 系统页面文件交换区信息

Swap swap = sigar.getSwap();

// 交换区总量

print("Total = " + swap.getTotal() / 1024L + "K av");

// 当前交换区使用量

print("Used = " + swap.getUsed() / 1024L + "K used");

// 当前交换区剩余量

print("Free = " + swap.getFree() / 1024L + "K free");

获取操作系统信息代码

// 取到当前操作系统的名称

String hostname = "";

try {

    hostname = InetAddress.getLocalHost().getHostName();

} catch (Exception exc) {

    try {

        hostname = sigar.getNetInfo().getHostName();

    } catch (SigarException e) {

        hostname = "localhost.unknown";

    } finally {

        sigar.close();

    }

}

print(hostname);


// 取当前操作系统的信息

OperatingSystem OS = OperatingSystem.getInstance();

// 操作系统内核类型如: 386、486、586等x86

print("OS.getArch() = " + OS.getArch());

print("OS.getCpuEndian() = " + OS.getCpuEndian());//

print("OS.getDataModel() = " + OS.getDataModel());//

// 系统描述

print("OS.getDescription() = " + OS.getDescription());

print("OS.getMachine() = " + OS.getMachine());//

// 操作系统类型

print("OS.getName() = " + OS.getName());

print("OS.getPatchLevel() = " + OS.getPatchLevel());//

// 操作系统的卖主

print("OS.getVendor() = " + OS.getVendor());

// 卖主名称

System.out

        .println("OS.getVendorCodeName() = " + OS.getVendorCodeName());

// 操作系统名称

print("OS.getVendorName() = " + OS.getVendorName());

// 操作系统卖主类型

print("OS.getVendorVersion() = " + OS.getVendorVersion());

// 操作系统的版本号

print("OS.getVersion() = " + OS.getVersion());


// 取当前系统进程表中的用户信息

Who who[] = sigar.getWhoList();

if (who != null && who.length > 0) {

    for (int i = 0; i < who.length; i++) {

        print("\n~~~~~~~~~" + String.valueOf(i) + "~~~~~~~~~");

        Who _who = who[i];

        print("getDevice() = " + _who.getDevice());

        print("getHost() = " + _who.getHost());

        print("getTime() = " + _who.getTime());

        // 当前系统进程表中的用户名

        print("getUser() = " + _who.getUser());

    }

}

获取磁盘信息代码

//取硬盘已有的分区及其详细信息(通过sigar.getFileSystemList()来获得FileSystem列表对象,然后对其进行编历

FileSystem fslist[] = sigar.getFileSystemList();

String dir = System.getProperty("user.home");// 当前用户文件夹路径

print(dir + "  " + fslist.length);

for (int i = 0; i < fslist.length; i++) {

    print("\n~~~~~~~~~~" + i + "~~~~~~~~~~");

FileSystem fs = fslist[i];

// 分区的盘符名称

print("fs.getDevName() = " + fs.getDevName());

// 分区的盘符名称

print("fs.getDirName() = " + fs.getDirName());

print("fs.getFlags() = " + fs.getFlags());//

// 文件系统类型,比如 FAT32、NTFS

print("fs.getSysTypeName() = " + fs.getSysTypeName());

// 文件系统类型名,比如本地硬盘、光驱、网络文件系统等

print("fs.getTypeName() = " + fs.getTypeName());

// 文件系统类型

print("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 : 本地硬盘

    // 文件系统总大小

    print(" Total = " + usage.getTotal() + "KB");

    // 文件系统剩余大小

    print(" Free = " + usage.getFree() + "KB");

    // 文件系统可用大小

    print(" Avail = " + usage.getAvail() + "KB");

    // 文件系统已经使用量

    print(" Used = " + usage.getUsed() + "KB");

    double usePercent = usage.getUsePercent() * 100D;

    // 文件系统资源的利用率

    print(" Usage = " + usePercent + "%");

    break;

case 3:// TYPE_NETWORK :网络

    break;

case 4:// TYPE_RAM_DISK :闪存

    break;

case 5:// TYPE_CDROM :光驱

    break;

case 6:// TYPE_SWAP :页面交换

    break;

}

print(" DiskReads = " + usage.getDiskReads());

print(" DiskWrites = " + usage.getDiskWrites());

}

获取网络信息代码

//当前机器的正式域名

try {

    print(InetAddress.getLocalHost().getCanonicalHostName());

} catch (UnknownHostException e) {

    try {

        print(sigar.getFQDN());

    } catch (SigarException ex) {

    } finally {

        sigar.close();

    }

}


// 取到当前机器的IP地址

String address = null;

try {

    address = InetAddress.getLocalHost().getHostAddress();

    // 没有出现异常而正常当取到的IP时,如果取到的不是网卡循回地址时就返回

    // 否则再通过Sigar工具包中的方法来获取

    print(address);

    if (!NetFlags.LOOPBACK_ADDRESS.equals(address)) {

    }

} catch (UnknownHostException e) {

    // hostname not in DNS or /etc/hosts

}

try {

    address = sigar.getNetInterfaceConfig().getAddress();

} catch (SigarException e) {

    address = NetFlags.LOOPBACK_ADDRESS;

} finally {

}

print(address);


// 取到当前机器的MAC地址

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;

    }

    hwaddr = cfg.getHwaddr();

    print(hwaddr);

    // break;

}

print(hwaddr != null ? hwaddr : null);


// 获取网络流量等信息

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());

    }

}


// 一些其他的信息

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;

    }

    print("cfg.getAddress() = " + cfg.getAddress());// IP地址

    print("cfg.getBroadcast() = " + cfg.getBroadcast());// 网关广播地址

    print("cfg.getHwaddr() = " + cfg.getHwaddr());// 网卡MAC地址

    print("cfg.getNetmask() = " + cfg.getNetmask());// 子网掩码

    System.out

            .println("cfg.getDescription() = " + cfg.getDescription());// 网卡描述信息

    print("cfg.getType() = " + cfg.getType());//

    System.out

            .println("cfg.getDestination() = " + cfg.getDestination());

    print("cfg.getFlags() = " + cfg.getFlags());//

    print("cfg.getMetric() = " + cfg.getMetric());

    print("cfg.getMtu() = " + cfg.getMtu());

    print("cfg.getName() = " + cfg.getName());

}

原文链接:https://blog.csdn.net/qq_39509702/article/details/119779825

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容