linux get cpu and memory info

class system_info final
{
public:
    system_info();
    static double getCpuPercent();
    static float getTotalMemPercent();
    static int getTotalMemInfo(int &nTotal,int &nFree,int &nAvailable);
};

#include "system_info.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <cstring>
#include <memory>
#include <vector>
#include <cstring>
#include <thread>

typedef struct cpu_occupy_          //定义一个cpu occupy的结构体
{
    char name[20];                  //定义一个char类型的数组名name有20个元素
    unsigned int user;              //定义一个无符号的int类型的user
    unsigned int nice;              //定义一个无符号的int类型的nice
    unsigned int system;            //定义一个无符号的int类型的system
    unsigned int idle;              //定义一个无符号的int类型的idle
    unsigned int iowait;
    unsigned int irq;
    unsigned int softirq;
}cpu_occupy_t;
typedef struct mem_occupy_{
        char nameTotal[20];
        unsigned int total;
        char nameFree[20];
        unsigned int free;
        char nameAvailable[20];
        unsigned int available;
}mem_occupy_t;

double cal_cpuoccupy (cpu_occupy_t *o, cpu_occupy_t *n)
{
    double od, nd;
    double id, sd;
    double cpu_use ;

    od = (double) (o->user + o->nice + o->system +o->idle+o->softirq+o->iowait+o->irq);//第一次(用户+优先级+系统+空闲)的时间再赋给od
    nd = (double) (n->user + n->nice + n->system +n->idle+n->softirq+n->iowait+n->irq);//第二次(用户+优先级+系统+空闲)的时间再赋给od

    id = (double) (o->idle);    //用户第一次和第二次的时间之差再赋给id
    sd = (double) (n->idle) ;    //系统第一次和第二次的时间之差再赋给sd
    if((nd-od) != 0)
    {
        auto t1_busy=od-id;
        auto t2_busy=nd-sd;
        auto busy_delta=t2_busy-t1_busy;
        auto all_delta=nd-od;
        if(t2_busy<=t1_busy)
            return 0.0;
        cpu_use = busy_delta / all_delta *100.0;
        //cpu_use =1- (sd-id)/(nd-od)*100.00;
    }
    else
        cpu_use = 0;
    return cpu_use;
}

std::vector<cpu_occupy_t> get_cpuoccupy (cpu_occupy_t *cpust)
{
    FILE *fd;
    int n;
    char buff[4096]={'\0'};
    cpu_occupy_t *cpu_occupy;
    cpu_occupy=cpust;

    std::vector<cpu_occupy_t> vResult;
    fd = fopen ("/proc/stat", "r");
    if(fd == NULL)
    {
            perror("fopen:");
            exit (0);
    }
    fgets (buff, sizeof(buff), fd);

    sscanf (buff, "%s %u %u %u %u %u %u %u", cpu_occupy->name, &cpu_occupy->user, &cpu_occupy->nice,&cpu_occupy->system, &cpu_occupy->idle ,&cpu_occupy->iowait,&cpu_occupy->irq,&cpu_occupy->softirq);
    const char *pname=cpu_occupy->name;
    while(std::strstr(pname,"cpu")!=nullptr)
    {
        const char *result=nullptr;
        result = std::strchr(buff,'\n');
        if(result!=nullptr)
        {
            ++result;
            std::memmove(buff,&buff[result-buff],sizeof(buff)-(result-buff));
            cpu_occupy_t cpu_core;
            cpu_occupy=&cpu_core;
            sscanf (buff, "%s %u %u %u %u %u %u %u", cpu_occupy->name, &cpu_occupy->user, &cpu_occupy->nice,&cpu_occupy->system, &cpu_occupy->idle ,&cpu_occupy->iowait,&cpu_occupy->irq,&cpu_occupy->softirq);
            vResult.push_back(cpu_core);
        }
        else
            break;
    }
    fclose(fd);
    return vResult;
}

double get_sysCpuUsage(std::vector<double> &perCpuUsage)
{
    cpu_occupy_t cpu_stat1;
    cpu_occupy_t cpu_stat2;
    double cpu;
    auto cpu_first=get_cpuoccupy((cpu_occupy_t *)&cpu_stat1);
    sleep(1);
    //第二次获取cpu使用情况
    auto cpu_second=get_cpuoccupy((cpu_occupy_t *)&cpu_stat2);

    //计算cpu总使用率
    cpu = cal_cpuoccupy ((cpu_occupy_t *)&cpu_stat1, (cpu_occupy_t *)&cpu_stat2);
    //计算各个cpu使用率
    for(size_t i=0;i<cpu_first.size();i++)
    {
        double p_cpu=cal_cpuoccupy ((cpu_occupy_t *)&cpu_first.at(i), (cpu_occupy_t *)&cpu_second.at(i));
        perCpuUsage.push_back(p_cpu);
    }

    return cpu;
}

/
int get_memoccupy(mem_occupy_t *mem)
{
    FILE *pf;
    char buff[256];
    char temp[20];
    mem_occupy_t *m = mem;

    pf = fopen ("/proc/meminfo", "r");
    if(pf == NULL)
        return -1;

    char *pstatus = NULL;
    pstatus = fgets (buff, sizeof(buff), pf);
    if( pstatus == NULL )
    {
        fclose(pf);
        return -1;
    }

    if(sscanf(buff, "%s %u %s", m->nameTotal, &m->total, temp) != 3)
    {
        fclose(pf);
        return -1;
    }

    pstatus = fgets (buff, sizeof(buff), pf);
    if( pstatus == NULL )
    {
        fclose(pf);
        return -1;
    }

    if(sscanf(buff, "%s %u %s", m->nameFree, &m->free, temp) != 3)
    {
        fclose(pf);
        return -1;
    }

    pstatus = fgets (buff, sizeof(buff), pf);
    if( pstatus == NULL )
    {
        fclose(pf);
        return -1;
    }

    if(sscanf (buff, "%s %u %s", m->nameAvailable, &m->available, temp) !=3)
    {
        fclose(pf);
        return -1;
    }

    fclose(pf);
    return 0;
}

system_info::system_info()
{

}
double system_info::getCpuPercent()
{
    std::vector<double> vCpuUsage;
    double totalCpuPercent= get_sysCpuUsage(vCpuUsage);
    return totalCpuPercent;
}
//get memory occupy percent
float system_info::getTotalMemPercent()
{
    mem_occupy_t mem;
    std::memset(&mem, 0 , sizeof(mem_occupy_t));
    if(get_memoccupy(&mem)<0)
        return 0.0;
    return ((mem.total - mem.free)*10000 / mem.total)/100.0;
}
//successed: return 0, failed: return -1
int system_info::getTotalMemInfo(int &nTotal,int &nFree,int &nAvailable)
{
    mem_occupy_t mem;
    std::memset(&mem, 0 , sizeof(mem_occupy_t));
    if(get_memoccupy(&mem)<0)
        return -1;
    nTotal= mem.total;
    nFree = mem.free;
    nAvailable = mem.available;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 一个简单的 Linux 监控 CPU、内存等脚本如下: ``` #!/bin/bash # Get current date and time DATE=$(date +"%Y-%m-%d %H:%M:%S") # Get CPU usage CPU=$(top -bn1 | grep load | awk '{printf "%.2f%%\t\t\n", $(NF-2)}') # Get memory usage MEM=$(free -m | awk 'NR==2{printf "%.2f%%\t\t", $3*100/$2 }') # Get disk usage DISK=$(df -h | awk '$NF=="/"{printf "%s\t\t", $5}') # Output the result echo -e "$DATE\t$CPU\t$MEM\t$DISK" ``` 这个脚本将会输出当前时间,CPU使用率,内存使用率和磁盘使用率。 你可以根据需要添加或删除监控项目。 ### 回答2: 在Linux系统中,可以通过编写Shell脚本来实现监控CPU、内存等关键参数。下面简单介绍一下如何编写这些脚本: 1. 监控CPU使用率 实现方法:使用Linux系统自带的命令top,结合grep、awk等命令进行数据处理和提取。具体步骤如下: 首先,使用top命令进行CPU使用率监控,使用如下命令: top -b -n 1 | grep "Cpu(s)" | awk '{print $2}' 这条命令实现了对CPU使用率的监控,其中-b参数表示在batch模式下运行,-n 1参数表示只取一次数据,grep "Cpu(s)"表示只取行中包含Cpu(s)的数据,awk '{print $2}'表示只输出第二列数据,也就是CPU使用率。 2. 监控内存使用情况 实现方法:使用Linux系统自带的命令free,结合grep、awk等命令进行数据处理和提取。具体步骤如下: 首先,使用free命令进行内存使用情况监控,使用如下命令: free | grep Mem | awk '{print $3/$2*100.0}' 这条命令实现了对内存使用率的监控,其中grep Mem表示只取含有Mem的行数据,awk '{print $3/$2*100.0}'表示输出内存使用率。 3. 监控磁盘空间 实现方法:使用Linux系统自带的命令df,结合grep、awk等命令进行数据处理和提取。具体步骤如下: 首先,使用df命令进行磁盘空间监控,使用如下命令: df | grep "/dev/" | awk '{print $5}' | sed 's/%//g' 这条命令实现了对磁盘空间使用率的监控,其中grep "/dev/"表示只取/dev/开头的行数据,awk '{print $5}'表示输出第五列数据,也就是使用率,最后使用sed 's/%//g'命令删除百分号。 综上所述,编写Linux系统监控CPU、内存等关键参数的脚本非常简单,只需要熟悉Linux系统命令的基本语法,就可以完成脚本的编写和调试。对于需要长期运行的脚本,可以使用Linux系统自带的定时任务工具crontab来实现定时监控。 ### 回答3: 要想在Linux系统中监控CPU、内存等系统资源的使用情况,我们可以编写脚本自动化完成这一过程。 对于CPU使用情况的监控,我们可以使用命令行工具top或者htop来实现。这两个工具可以实时显示进程的CPU使用情况、内存使用情况、进程数量等信息。我们可以通过grep命令筛选出我们需要的信息,并将其重定向到日志文件中。另外,我们还可以使用sar命令来定时收集系统信息,并将其写入日志文件中。 对于内存使用情况的监控,我们可以使用free命令来查看系统内存使用情况,也可以使用vmstat命令来监控内存使用情况和交换分区的情况。我们同样可以使用sar命令来定时收集系统信息,并将其写入日志文件中。 此外,我们还可以使用一些第三方监控工具来监控系统资源的使用情况,如Zabbix、Nagios、Monit等。这些工具一般都有可视化界面,可以对系统性能进行更全面、更方便的监控。 在编写脚本时,我们需要确定监控间隔时间、输出日志文件名、监控指标等参数,并且要保证脚本的可重复性和稳定性。另外,我们还需要将脚本添加到系统定时任务中,以达到定时监控的效果。 总的来说,Linux下的系统资源监控是非常重要的,可以帮助我们及时发现问题并进行处理。编写脚本是一种自动化的方法,可以让我们更加高效地完成这一任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值