Sigar(System Information Gatherer And Reporter),是一个开源的工具,提供了跨平台的系统信息收集的API,核心由C语言实现的。项目中使用Sigar进行服务器监控。很多人都对它进行了介绍:

上面两个链接中有对Sigar的介绍和使用方法。官方的介绍在这里,英语好的话还是看这个吧:

通过上面的链接,测试Sigar或者写个Sigar的Demo应该没问题了。另外,Sigar这个项目已经不再活跃了,2014年的commit只有5个,不知道是否有其他监控服务器工具,希望大家不吝赐教!

 
 

现在要在项目中使用Sigar,我们项目使用maven进行构建,网上找到了如何在maven中配置Sigar的帖子:

各位大神可以试试,我功底太浅(确切的说是没有功底),没试出来。后来发现个简单办法,虽然不甘心,先用着,也是网上找到的:

在使用的时候注意,上面链接给出了一部分代码,其他的代码在:

里面有个OsCheck类,还有就是代码中使用的Resources是guava中的Resources而不是java中的,所有如果使用maven的话,pom.xml中要加

<dependency>

<groupId>com.google.guava</groupId>

<artifactId>guava</artifactId>

<version>18.0</version>

</dependency>

 

我们的项目是一个J2EE项目,开发时使用的中间件是Tomcat,在Windows和Linux上跑都没有问,可是当部署到服务器上的时候,就开始报错:

java.lang.UnsatisfiedLinkError: org.hyperic.sigar.Sigar.getNativeVersion()Ljava/lang/String;

或者

NoClassDefFoundError: Could not initialize class

如果在服务器上直接使用java -jar sigar-bin/lib/sigar.jar的方式使用,是不会报错的。

服务器上用的是TongWeb(我知道大家都没听说过),据说他和GlassFlash很像。

在查找原因时发现这个帖子:

回答是这样的:

On Redhat linux with JBoss server adding sigar jar to the LDPATH has resolve the problem.

我想LDPATH指的就是LD_LIBRARY_PATH吧,同时发现了这个帖子:

这位楼主解决了这个问题,好的,那应该就是LD_LIBRARY_PATH的问题了,但是先不要按照他说的来,一个一个加载动态库太麻烦了。发现了这个问题出现的具体原因:

是出于安全原因,Linux系统做了限制(Because of security reasons, Linux system to the limit. LD_LIBRARY_PATH not loading from .profile nor /etc/environment)。有人已经翻译好了:

好的,只要我们在每次运行前:

export LD_LIBRARY_PATH=DIR_where_Your_Sigar_Lib_is:$LD_LIBRARY_PATH

或者改/etc/ld.so.conf就可以了。

 

综合上面所提到的解决方法,最终项目中是这样改的:

  • pom.xml中增加Sigar与Guava依赖:

     
     

    • <dependency>
    • <groupId>org.fusesource</groupId>
    • <artifactId>sigar</artifactId>
    • <version>1.6.4</version>
    • </dependency>
    • <dependency>
    • <groupId>com.google.guava</groupId>
    • <artifactId>guava</artifactId>
    • <version>18.0</version>
    • </dependency>
  • 在 http://sourceforge.net/projects/sigar/files/ 下载Sigar-1.6.4,将hyperic-sigar-1.6.4\sigar-bin\lib这个文件夹重命名为sigar放到项目的\src\main\resources\目录下
  • 增加如下OsCheck类:

     
     

    • public final class OsCheck {
    • /**

      * types of Operating Systems

      */

    • public enum OSType {
    • Windows, MacOS, Linux, Other
    • }
    • protected static OSType detectedOS;
    • /**

      * detected the operating system from the os.name System property and cache

      * the result

      *

      * @returns - the operating system detected

      */

    • public static OSType getOperatingSystemType() {
    • if (detectedOS == null) {
    • String OS = System.getProperty("os.name", "generic").toLowerCase();
    • if (OS.indexOf("win") >= 0) {
    • detectedOS = OSType.Windows;
    • } else if ((OS.indexOf("mac") >= 0) || (OS.indexOf("darwin") >= 0)) {
    • detectedOS = OSType.MacOS;
    • } else if (OS.indexOf("nux") >= 0) {
    • detectedOS = OSType.Linux;
    • } else {
    • detectedOS = OSType.Other;
    • }
    • }
    • return detectedOS;
    • }
    • }
  • 增加SigarUtil类:

     
     

    • import java.io.File;
    • import com.google.common.io.Resources;
    • import org.hyperic.sigar.Sigar;
    • public class SigarUtil {
    • private static class SigarUtilHolder{
    • private static final SigarUtil INSTANCE = new SigarUtil();
    • private static final Sigar Sigar = new Sigar();
    • }
    • private SigarUtil (){
    • try {
    • String file = Resources.getResource("sigar/.sigar_shellrc").getFile();
    • File classPath = new File(file).getParentFile();
    • String path = System.getProperty("java.library.path");
    • if (OsCheck.getOperatingSystemType() == OsCheck.OSType.Windows) {
    • path += ";" + classPath.getCanonicalPath();
    • } else {
    • path += ":" + classPath.getCanonicalPath();
    • }
    • System.setProperty("java.library.path", path);
    • System.out.println(path);
    • } catch (Exception e) {
    • }
    • }
    • public static final Sigar getInstance(){
    • return SigarUtilHolder.Sigar;
    • }
    • public static final SigarUtil getSigarUtilInstance(){
    • return SigarUtilHolder.INSTANCE;
    • }
    • }
  • 按如下方式调用:
    • public
      void testLib() {
    • try {
    • Sigar sigar = SigarUtil.getInstance();
    • CpuPerc cpu = sigar.getCpuPerc();
    • System.out.println(String.valueOf(cpu.getCombined()));
    • } catch (SigarException e) {
    • e.printStackTrace();
    • }
    • }
  • 如果是Tomcat,现在项目已经可以使用了,但是如果使用其他中间件时报错的话就在终端输入

    export LD_LIBRARY_PATH=DIR_where_Your_Sigar_Lib_is:$LD_LIBRARY_PATH

    或者改/etc/ld.so.conf就可以了。如果使用第一种方式。服务器重启后就需要重新设置,所以我们还是修改/etc/ld.so.conf吧。/etc/ld.so.conf下面加一行sigar的路径,保存过后为了让动态链接库为系统所共享,还需运行动态链接库的管理命令ldconfig一下。

 

用fusioncharts做实时显示:

Sigar使用的更多相关文章

  1. sigar

    从http://sourceforge.net/projects/sigar/files/sigar/1.6/hyperic-sigar-1.6.4.zip/download下载sigar, 参照了h ...

  2. Sigar介绍与使用

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

  3. ava如何实现系统监控、系统信息收集、sigar开源API的学习(转)

    ava如何实现系统监控.系统信息收集.sigar开源API的学习(转) 转自:http://liningjustsoso.iteye.com/blog/1254584 首先给大家介绍一个开源工具Sig ...

  4. java使用sigar 遇到问题的解决方案

    先给大家介绍一个开源工具Sigar 官网:http://sigar.hyperic.com/ API:http://www.hyperic.com/support/docs/sigar/index-a ...

  5. Sigar.jar获取系统信息

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

  6. sigar监控

    相关参照博客: http://liningjustsoso.iteye.com/blog/1254584 http://blog.csdn.net/aoxida/article/category/12 ...

  7. SIGAR - System Information Gatherer And Reporter

    https://support.hyperic.com/display/SIGAR/Home 收藏一篇: http://www.cnitblog.com/houcy/archive/2012/11/2 ...

  8. Java系统监控(淘汰sigar)

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

  9. java sigar获取本地信息以及org.hyperic.sigar.SigarException: The device is not ready报错解决

    window下,使用java sigar 获取磁盘使用率,cpu使用率以及内存使用情况等信息时. 一:首先需要下载jar包和相关文件 sigar-1.6.4.zip 如果想了解更多可以去 sigar官 ...

随机推荐

  1. erlang服务器启动,有情况会报,enif_send: env==NULL no ono-SMP VMAborted 的错误报告?

    问题的原因所在: 1:因为你当前使用的主机是一个单核的主机(不会自动启动): 2:多核上如果不设置-smp enable是不会有什么问题的,因为从OTP R12B开始,如果操作系统报告有多于1个的CP ...

  2. Log4J详解

    Log4J 简介  Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使 ...

  3. Swift函数

    函数 函数 介绍 // func // 在Swift中,一个个的方法就是函数 // 1.定义函数的关键字是func // 在定义函数的时候,不管有没有参数都加括号,参数写在括号中 // 在定义函数时, ...

  4. struts入门实例

    入门实例 1  .下载struts-2.3.16.3-all  .不摆了.看哈就会下载了. 2  . 解压  后 找到 apps 文件夹. 3.    打开后将 struts2-blank.war   ...

  5. myeclipse编译问题

    这个问题困扰了两天,在用springmvc编写Controller层的时候.我前台js跳转时@RequestMapping无法捕获到,但是之前的编写的都可以捕获正常执行.然后我更改js的跳转地址,发现 ...

  6. $scope 的生命周期

    当Angular关心的事件发生在浏览器中时,比如用户在通过ng-model属性监控的输入字段中输入,或者带有ng-click属性的按钮被点击时,Angular的事件循环都会启动.这个事件将在Angul ...

  7. sql server数据库连接问题处理

    下面请一字一句地看,一遍就设置成功,比你设置几十遍失败,费时会少得多. 首先,在连接数据库之前必须保证SQL Server 2012是采用SQL Server身份验证方式而不是windows身份验证方 ...

  8. iOS开发一个用户登录注册模块需要解决的坑

    最近和另外一位同事负责公司登录和用户中心模块的开发工作,开发周期计划两周,减去和产品和接口的协调时间,再减去由于原型图和接口的问题,导致强迫症纠结症状高发,情绪不稳定耗费的时间,能在两周基本完成也算是 ...

  9. JDBC代码示例

    package test; import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;imp ...

  10. VS.net中快捷键收缩和展开代码段 (转)

    i. Ctrl-M-O   折叠所有方法 ii. Ctrl-M-P   展开所有方法并停止大纲显示(不可以再折叠了) iii. Ctrl-M-M   折叠或展开当前方法 iv. Ctrl-M-L展开所 ...