`

sigar开发注意点

    博客分类:
  • Java
 
阅读更多
   <dependency>
   <groupId>org.fusesource</groupId>
   <artifactId>sigar</artifactId>
   <version>1.6.4</version>
  </dependency>

  1、首先是Sigar中提供的DLL如何加载,可以通过设置其为CLASSPATH后,我们还可以通过程序来把只需要的DLL复制到默认的CLASSPATH路径下。

 

首先是通过参数的判断,是加载那种DLL,下面给出加载DLL的函数:

    
    private static Logger logger = Logger.getLogger(ListenerMain.class);
    
    public static void main(String[] args)
        throws SigarException
    {
        try
        {
            logger.debug(System.getProperty("java.library.path"));
            InputStream inputStream = new FileInputStream("../config/log4j.properties");
            PropertyConfigurator.configure(inputStream);
            
            if (null == args)
            {
                logger.error("请输入系统架构,例如Window 32位,则输入win32,win64,如果是Linux,则输入linux32,linux,目前只支持这2个系统");
                return;
            }
            
            // String sys = args[0];
            String sys = "win32";
            
            if (null != args && args.length > 0)
            {
                sys = args[0];
            }
            
            String dllPath = "";
            String dllName = "";
            if ("win32".equals(sys))
            {
                dllPath = "/dll/sigar-x86-winnt.dll";
                dllName = "sigar-x86-winnt.dll";
            }
            else if ("win64".equals(sys))
            {
                dllPath = "/dll/sigar-amd64-winnt.dll";
                dllName = "sigar-amd64-winnt.dll";
            }
            else if ("linux32".equals(sys))
            {
                dllPath = "/dll/libsigar-x86-linux.so";
                dllName = "libsigar-x86-linux.so";
            }
            else if (("linux64").equals(sys))
            {
                dllPath = "/dll/libsigar-amd64-linux.so";
                dllName = "libsigar-amd64-linux.so";
            }
            
            if (dllPath.equals(""))
            {
                logger.error("输入的系统架构信息不正确,请重新输入");
                return;
            }
            //设置DLL
            setLibrary(dllPath,dllName);
        }
        catch (Exception e)
       {
            
        }
        
    }
    
    private static void setLibrary(String dllPath,String dllName)
    {
        try
        {
            // 获取到java.library.path
            String libpath = System.getProperty("java.library.path");
            if (libpath == null || libpath.length() == 0)
            {
                throw new RuntimeException("java.library.path is null");
            }
            
            String path = null;
            StringTokenizer st = new StringTokenizer(libpath, System.getProperty("path.separator"));
            if (st.hasMoreElements())
            {
                path = st.nextToken();
            }
            else
            {
                throw new RuntimeException("can not split library path:" + libpath);
            }
            // 把dll文件写入到java.library.path中该dll放在ConvertWord2HM相同目录下,这个可以是你的类名
            InputStream inputStream = ListenerMain.class.getResource(dllPath).openStream();
            final File dllFile = new File(new File(path), dllName);
            if (!dllFile.exists())
            {
                FileOutputStream outputStream = new FileOutputStream(dllFile);
                byte[] array = new byte[8192];
                int bytesRead = -1;
                while ((bytesRead = inputStream.read(array) )!= -1)
                {
                    outputStream.write(array, 0, bytesRead);
                }
                outputStream.flush();
                outputStream.close();
            }
            // 动态加载dll
            System.load(dllFile.getPath());
            
            // 在虚拟机关闭的时候删除dll
            // dllFile.deleteOnExit();
            
        }
        catch (Throwable e)
        {
            logger.error("load dll error", e);
        }
    }

2、获取服务CPU、内存、硬盘的占用率

    public double getDeviceCpuValue()
        throws SigarException
    {
        double combined = 0f;
        Sigar sigar = new Sigar();
        
        // 方式二,不管是单块CPU还是多CPU都适用
        CpuPerc cpuList[] = null;
        
        cpuList = sigar.getCpuPercList();
        
        for (int i = 0; i < cpuList.length; i++)
        {
            combined = combined + cpuList[i].getCombined();
        }
        logger.debug("device cpu = " + combined);
        return combined / cpuList.length;
    }

 

    public float getDeviceMemValue()
        throws SigarException
    {
        // a)物理内存信息
        Sigar sigar = new Sigar();
        
        Mem mem;
        mem = sigar.getMem();
        return (float)mem.getUsed() / (float)mem.getTotal();
    }

 

public float getDeviceHdValue()
        throws SigarException
    {
        float hdValue = 0f;
        
        Sigar sigar = new Sigar();
        FileSystem fslist[] = sigar.getFileSystemList();
        
        float total = 0f;
        
        float used = 0f;
        for (int i = 0; i < fslist.length; i++)
        {
            FileSystem fs = fslist[i];
            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 : 本地硬盘
                    // 文件系统总大小
                    total = total + usage.getTotal();
                    used = used + usage.getUsed();
                    break;
                case 3:// TYPE_NETWORK :网络
                    break;
                case 4:// TYPE_RAM_DISK :闪存
                    break;
                case 5:// TYPE_CDROM :光驱
                    break;
                case 6:// TYPE_SWAP :页面交换
                    break;
            }
        }
        hdValue = used / total;
        return hdValue;
    }

 

3、Sigar不能正确获取某个进程的占用率,只能通过Shell脚本来实现,但是可以获取某个进程内存的使用率:

float memValue = (float)procMem.getResident() / (float)sigar.getMem().getTotal();

 

4、如何判断网卡是否正常使用,在Sigar并没有提供这样的方法,但是通过判断是否存在正常的IP,则说明

该网卡是否正常使用。

    public Map<String, String> getNeWorkCards()
        throws SigarException
    {
        Sigar sigar = null;
        sigar = new Sigar();
        String[] ifaces = sigar.getNetInterfaceList();
        Map<String, String> map = new HashMap<String, String>();
        
        for (int i = 0; i < ifaces.length; i++)
        {
            
            NetInterfaceConfig cfg = sigar.getNetInterfaceConfig(ifaces[i]);
            
            if (NetFlags.LOOPBACK_ADDRESS.equals(cfg.getAddress())
                || NetFlags.LOOPBACK_ADDRESS_V6.equals(cfg.getAddress()))
            {
                continue;
            }
            
            if ((NetFlags.ANY_ADDR.equals(cfg.getAddress()) && NetFlags.ANY_ADDR.equals(cfg.getBroadcast()))
                || (NetFlags.ANY_ADDR_V6.equals(cfg.getAddress()) && NetFlags.ANY_ADDR_V6.equals(cfg.getBroadcast())))
            {
                map.put(ifaces[i], AlarmContants.ABNORMAL + "");
            }
            else
            {
                map.put(ifaces[i], AlarmContants.NORMAL + "");
            }
        }
        
        return map;
    }

 

5、在Window及Linux上,Sigar得到一些信息还是有很大区别的,一般来说,Window得到的信息更全些,

而Linux相对比较少,这就需要我们自己编写Shell脚本去获取一些需要的信息了。

6、Sigar不能获取硬件的信息

分享到:
评论

相关推荐

    SugarCRM傻瓜教程

    请注意,教程中的内容、图片和示例都是基于特定版本的SugarCRM,用户在使用过程中应结合实际版本进行操作。教程的版权信息显示,未经出版商或版权所有者的明确许可,不得随意复制、存储或传输教程内容。如果读者需要...

    Sugar (Android orm )

    **Sugar ORM** 是一款针对Android平台的...总之,Sugar ORM为Android开发提供了便利的数据持久化解决方案,让开发者能更高效地处理数据库操作,降低项目复杂性。然而,选择ORM框架应根据项目的具体需求和规模进行权衡。

    sugar.zip

    4. **性能优化**:在处理大量数据或复杂视图时,注意性能优化,避免因动画导致的应用卡顿。 通过以上步骤,我们可以使用MotionLayout成功地实现类似高德地图的bottomSheet效果。在实际开发中,根据项目的具体需求,...

    sugarcrm5.5

    【SugarCRM 5.5 知识点详解】 SugarCRM 是一款开源的客户关系管理(CRM)系统,它帮助企业管理和优化与客户的互动,提高销售效率,提升客户服务质量和团队协作。5.5 版本是 SugarCRM 的一个重要里程碑,提供了一...

    糖电子:基于Electorn的轻量级开发框架

    糖电子基于Electorn的轻量级开发框架简体中文|安装npm i sugar-electron --save-dev脚手架npm i sugar-electron-cli -gsugar-electron-cli init注意事项sugar-electron渲染进程依赖node模块,所以nodeIntegration,...

    Diana轻量级开发框架白皮书1

    值得注意的是,Diana框架的源代码完全开放,附带完整的授权,开发者可以放心用于自己的产品开发。 在整体设计方面,Diana提供两种前端模板选择,只需在配置文件中切换,即可轻松改变界面风格。它支持Sql Server和...

    HAML.sugar:在 Espresso 文本编辑器中支持 HAML 语言的 Sugar 插件

    请注意,由于插件可能不兼容Espresso的最新版本,或者由于Espresso自身的更新导致插件失效,因此在安装前最好确认Espresso和HAML.sugar的兼容性信息。 总的来说,HAML.sugar是提升Espresso用户在处理HAML项目时体验...

    简单的方便的实体类生成工具

    在实际使用过程中,要注意以下几点: - 确保数据库连接信息的准确性,避免因连接问题导致工具无法正常工作。 - 对于复杂的数据库表结构,如外键关联、自定义类型,工具可能无法完全自动处理,可能需要手动调整生成...

    SqlSugar.Tools.Release.zip

    3. **不支持转换**:需要注意的是,这个工具并不自动处理数据类型转换。例如,数据库中的日期时间类型在C#中可能需要转化为DateTime对象,但工具不会自动进行这种转换。开发者需要在生成的代码基础上手动进行调整或...

    Many2ManyTest:测试项目,包括多对多关系,使用 Sugar DB

    6. **查询优化**:虽然Sugar ORM简化了SQL操作,但仍然需要注意查询性能。合理设计数据库索引、避免N+1查询等问题,对于提高应用性能至关重要。 7. **测试用例**:这个测试项目可能包含了多种测试场景,比如添加新...

    Guide_AlineaSol_SolCRM_WorkFlowManager_4.X

    1. "sugarcrm的workflow插件,用于sugarcrm的学习和技术开发":说明此插件是针对SugarCRM系统的一个工作流管理工具,它可以被用来学习SugarCRM系统的工作原理,也可以用于开发和定制工作流。 2. "AlineaSol ...

    LabyrinthJS.activity:Sugar-Web中迷宫活动的原型(思维导图工具)

    5. **文档**:README文件、API文档等,解释项目的目的、如何运行和开发中的注意事项。 6. **构建脚本**:如Gruntfile.js或Gulpfile.js,用于自动化构建过程,如代码压缩、合并等。 综上所述,LabyrinthJS.activity...

    C# 对SQL SERVER 2000操作封装类

    在.NET框架中,C#是一种常用的编程语言,用于开发各种应用程序,包括与数据库交互的系统。本项目聚焦于"C#对SQL SERVER 2000操作封装类",旨在提供一个方便、高效的数据库操作工具,简化数据库的增、删、改操作。...

    OrmComparison.zip

    需要注意的是,性能测试的结果可能会因具体应用场景、数据库设计、硬件配置等因素而有所不同。在选择ORM框架时,应根据项目需求、团队技能和性能要求进行综合考虑。对于那些重视性能的项目,Dapper或Mego可能是更好...

    sugar-tracker

    可用脚本在项目目录中,可以运行:yarn start 在开发模式下运行应用程序。 打开在浏览器中查看它。 如果您进行编辑,则页面将重新加载。 您还将在控制台中看到任何棉绒错误。yarn test 在交互式监视模式下启动测试...

    一个向Python添加一些反Python语法糖的库-Python开发

    spell_sugar这个库向Python添加了一些反Python的“语法糖”。 注意:这仅仅是一个实验性的原型,它显示了Python中运算符重载的一些潜力。 仅在Python 3.6.0下进行了测试。 语法_糖这可以为Python添加一些反Python的...

    Python-syntaxsugar向Python添加很酷的语法糖

    在Python编程语言中,"语法糖"(Syntax Sugar)指的是通过简洁、易读的语法来表达复杂的概念...然而,使用第三方库时,也需要注意兼容性问题和代码的可移植性,确保在享受便利的同时,不失去Python原有的简洁和灵活性。

    在Go中实现快速,结构化,水平的日志记录。-Golang开发

    :high_voltage:zap在Go中快速,结构化,水平地记录日志。 ... 安装go get -u go.uber.org...logger,_:= zap.NewProduction()推迟logger.Sync()//刷新缓冲区(如果有的话):= logger.Sugar()sugar.Infow(“ t失败

Global site tag (gtag.js) - Google Analytics