Sigar使用

Sigar(System Information Gatherer And Reporter),是一個開源的工具,提供了跨平臺的系統信息收集的API,核心由C語言實現的。項目中使用Sigar進行服務器監控。不少人都對它進行了介紹: html

上面兩個連接中有對Sigar的介紹和使用方法。官方的介紹在這裏,英語好的話仍是看這個吧: java

經過上面的連接,測試Sigar或者寫個Sigar的Demo應該沒問題了。另外,Sigar這個項目已經再也不活躍了,2014年的commit只有5個,不知道是否有其餘監控服務器工具,但願你們不吝賜教! linux

   

如今要在項目中使用Sigar,咱們項目使用maven進行構建,網上找到了如何在maven中配置Sigar的帖子: git

各位大神能夠試試,我功底太淺(確切的說是沒有功底),沒試出來。後來發現個簡單辦法,雖然不甘心,先用着,也是網上找到的: github

在使用的時候注意,上面連接給出了一部分代碼,其餘的代碼在: shell

裏面有個OsCheck類,還有就是代碼中使用的Resources是guava中的Resources而不是java中的,全部若是使用maven的話,pom.xml中要加 安全

<dependency> 服務器

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

<artifactId>guava</artifactId> wordpress

<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作實時顯示:

相關文章
相關標籤/搜索