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. maven pom.xml

    什么是pom?    pom作为项目对象模型.通过xml表示maven项目,使用pom.xml来实现.主要描述了项目:包括配置文件:开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的u ...

  2. Coding源码学习第一部分(AppDelegate.m)

    前言:在此首先感谢开源,感谢大神们的无私分享. Coding 的主页:https://coding.net/app#app-feature Coding 自己家的仓库:https://coding.n ...

  3. Socket Receive 避免 Blocking

    我们知道 Socket Blocking 属性默认true . 表明Socket 处于同步调用 , Connect , 或 Send , Receive 需等待动作 完成才能继续执行. 有一种应用场景 ...

  4. Bootstrap <基础二十六>进度条

    Bootstrap 进度条.在本教程中,你将看到如何使用 Bootstrap 创建加载.重定向或动作状态的进度条. Bootstrap 进度条使用 CSS3 过渡和动画来获得该效果.Internet ...

  5. Emmet 使用说明。

    Emmet for Sublime Text Official Emmet plugin for Sublime Text. How to install Available actions Exte ...

  6. React Native 组件样式测试

    View组件默认样式(注意默认flexDirection:'column') {flexGrow:0,flexShrink:0,flexBasis:'auto',flexDirection:'colu ...

  7. pandas 数据检索

    使用pandas的一些方法: 条件检索 按index取值

  8. spring入门教程——笔记

    Spring学习笔记(1)----简单的实例 ---------------------------------   首先需要准备Spring包,可从官方网站上下载.   下载解压后,必须的两个包是s ...

  9. 借用Google API在线生成网站二维码地址方法

    二维码其实很早就出现了,在国外很多年前就已经在应用了,国内这两年才开始异常的火爆,智能手机的发展,以及微博.微信等移动应用带动了二维码的普及.那么,如果为网址在线生成二维码呢?下面我们就来介绍一下Go ...

  10. [make]makefile使用积累

    [注]:文中所指手册皆为GNU make Version 4.1 1.make的一般特性 1.1.Makefiles的构成 Makefiles包含五种元素: 显式规则(explicit rules), ...