编程获取linux的CPU使用的内存使用情况
Linux可用下top、ps命令检查当前的cpu、mem用法。下面简单的例子:
一、采用ps查看资源消耗的过程
ps -aux
当您查看进程信息,第三列是CPU入住。
[root@localhost utx86]# ps -aux | grep my_process
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.7/FAQ
root 14415 3.4 0.9 37436 20328 pts/12 SL+ 14:18 0:05 ./my_process
root 14464 0.0 0.0 3852 572 pts/3 S+ 14:20 0:00 grep my_process
每一列含义例如以下
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
即my_process进程当前占用cpu 3.4%, 内存0.9%
二、top动态查看系统负荷
top -n 1
显示后退出
[root@localhost utx86]# top -n 1
top - 14:23:20 up 5:14, 14 users, load average: 0.00, 0.04, 0.01
Tasks: 183 total, 1 running, 181 sleeping, 1 stopped, 0 zombie
Cpu(s): 1.8%us, 1.4%sy, 0.0%ni, 95.8%id, 0.7%wa, 0.1%hi, 0.2%si, 0.0%st
Mem: 2066240k total, 1507316k used, 558924k free, 190472k buffers
Swap: 2031608k total, 88k used, 2031520k free, 1087184k cached
1、获取cpu占用情况
[root@localhost utx86]# top -n 1 |grep Cpu
Cpu(s): 1.9%us, 1.3%sy, 0.0%ni, 95.9%id, 0.6%wa, 0.1%hi, 0.2%si, 0.0%st
解释:1.9%us是用户占用cpu情况
1.3%sy,是系统占用cpu情况
得到详细列的值:
[root@localhost utx86]# top -n 1 |grep Cpu | cut -d "," -f 1 | cut -d ":" -f 2
1.9%us
[root@localhost utx86]# top -n 1 |grep Cpu | cut -d "," -f 2
1.3%sy
2、获得内存占用情况
[root@localhost utx86]# top -n 1 |grep Mem
Mem: 2066240k total, 1515784k used, 550456k free, 195336k buffers
获得内存情况指定列
[root@localhost c++_zp]# top -n 1 |grep Mem | cut -d "," -f 1 | cut -d ":" -f 2
2066240k total
[root@localhost c++_zp]# top -n 1 |grep Mem | cut -d "," -f 2
1585676k used
三、编程实现
如今能够通过程序将cpu使用率、内存使用情况保存到文件里
// test.cpp
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
system("top -n 1 |grep Cpu | cut -d \",\" -f 1 | cut -d \":\" -f 2 >cpu.txt");
system("top -n 1 |grep Cpu | cut -d \",\" -f 2 >>cpu.txt");
system("top -n 1 |grep Mem | cut -d \",\" -f 1 | cut -d \":\" -f 2 >>cpu.txt");
system("top -n 1 |grep Mem | cut -d \",\" -f 2 >>cpu.txt");
return 0;
}
编译、执行:
[root@localhost study]# g++ test.cpp
[root@localhost study]# ./a.out
[root@localhost study]# cat cpu.txt
2.1%us
1.5%sy
2066240k total
1619784k used
四、硬盘使用率编程实现
1.硬盘使用率 命令df -lh
2.程序实现。调用statfs
int statfs(const char *path, struct statfs *buf);
int fstatfs(int fd, struct statfs *buf);
struct statfs {
long f_type; /* type of filesystem (see below) */
long f_bsize; /* optimal transfer block size */
long f_blocks; /* total data blocks in file system */
long f_bfree; /* free blocks in fs */
long f_bavail; /* free blocks avail to non-superuser */
long f_files; /* total file nodes in file system */
long f_ffree; /* free file nodes in fs */
fsid_t f_fsid; /* file system id */
long f_namelen; /* maximum length of filenames */
};
int fstatvfs(int fildes, struct statvfs *buf);
int statvfs(const char *restrict path, struct statvfs *restrict buf);
struct statvfs {
unsigned long f_bsize; /* file system block size */
unsigned long f_frsize; /* fragment size */
fsblkcnt_t f_blocks; /* size of fs in f_frsize units */
fsblkcnt_t f_bfree; /* # free blocks */
fsblkcnt_t f_bavail; /* # free blocks for non-root */
fsfilcnt_t f_files; /* # inodes */
fsfilcnt_t f_ffree; /* # free inodes */
fsfilcnt_t f_favail; /* # free inodes for non-root */
unsigned long f_fsid; /* file system id */
unsigned long f_flag; /* mount flags */
unsigned long f_namemax; /* maximum filename length */
};
#include <sys/vfs.h>
#include <sys/statvfs.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int gethd(char *path);
int main()
{
char buf[256],*ptr;
FILE *file;
while(1)
{
file=fopen("/etc/fstab","r");
if(!file)return;
memset(buf,0,sizeof(buf));
while(fgets(buf,sizeof(buf),file))
{
ptr=strtok(buf," ");
if(ptr&&((strncmp(ptr,"/dev",4)==0)))
{
ptr=strtok(NULL," ");
gethd(ptr);
}
}
fclose(file);
sleep(2);
}
}
int gethd(char *path)
{
struct statvfs stat1;
statvfs(path,&stat1);
if(stat1.f_flag)
printf("%s total=%dK free=%dK %0.1f%%
\n",path,stat1.f_bsize*stat1.f_blocks/1024,stat1.f_bsize*stat1.f_bfree/1024,
((float)stat1.f_blocks-(float)stat1.f_bfree)/(float)stat1.f_blocks*100);
}
shell
监视磁盘hda1
#!/bin/sh
# disk_mon
# monitor the disk space
# get percent column and strip off header row from df
LOOK_OUT=0
until [ "$LOOK_OUT" -gt "90" ]
do
LOOK_OUT=`df | grep /hda1 | awk '{print $5}' | sed 's/%//g'`
echo $LOOK_OUT%
sleep 1
done
echo "Disk hda1 is nearly full!"
hdtest.sh
#!/bin/ksh
#检測硬盘剩余空间并警告的shell V050921
#简单说明: 可由root用户将此脚本增加crontab,启动时间一般最好设为每天营业前,当此脚本启动时如检測到已用硬盘空间超过指定范围,则将hdwarning.sh脚本复制到指定用户根文件夹下;否则将删除指定用户的文件夹下的hdwarning.sh脚本.
usedhd=80 #自己定义超限已用硬盘空间大小比例,默觉得80%
test "$1" && userdir=$1 || userdir=/usr/scabs #前台用户的文件夹(默认设为统版用户),也可在调用此脚本时加上指定前台用户的文件夹參数
hdwarning=$(df -v |sed '1d;s/.$//;s/\/dev\///'|awk '$6>'"$usedhd"' {print $2," = ",$6"%"}')
test "$hdwarning" && { cp /usr/bin/hdwarning.sh ${userdir}/hdwarning.sh \
> ${userdir}/hdwarning.log  chmod 777 ${userdir}/hdwarning.sh ${userdir}/hdwarning.log } \
|| { rm ${userdir}/hdwarning.sh 2>/dev/null \
mv ${userdir}/hdwarning.log ${userdir}/hdwarning.log.bak 2>/dev/null }
hdwarning.sh
#!/bin/ksh
#检測硬盘剩余空间并警告的shell V050921
#添加当超标时,仅仅在预先指定的前N位预先的指定用户登录时才显示提示信息,
#即仅仅有这前面N位用户才有可能及时反馈,避免当超标时接到过多的前台反馈电话 V050923
#请先编辑指定用户根下的 .profile ,在最后追加一行
#  test -x hdwarning.sh &&  ./hdwarning.sh
#若.profile最后已增加了自启动专用程序命令行,则请在此行前面插入上述行
#简单说明: 当指定用户登录后,若当前文件夹中hdwarning.sh脚本存在(一般此
#时硬盘已用空间已经超标),则执行此脚本,并在屏幕显示警告信息,此时终端
#操作人员应该及时将此信息把馈给预先指定的部门或预先指定的管理人员,
#以便作对应的处理.若未超标或已清理磁盘文件并达标,则将删除脚本自身
#hdwarning.sh(取消登录时的检測和警告信息)
usedhd=80 #自己定义超限已用硬盘空间大小比例,默觉得80%
loginnum=10 #自己定义最初登录反馈的用户数,默觉得前 10 位
name="运维部" #接受反馈的部门或管理人员
tel="2113714 2110394" #接受反馈的部门或管理人员的联系方式或电话
test "$1" && userdir=$1 || userdir=/usr/scabs #前台用户的文件夹(默认设为统版用户),也可在调用此
#脚本时加上指定前台用户的文件夹參数
hdwaring()
{ ttyname=$(tty)
echo ${ttyname##*
shell cpu====================================================================:
/proc目路下的内存文件系统映射了系统的执行时的一些信息。包含进程列表。
内存信息。CPU使用情况。还有网络等等
所以能够通过读/proc下的文件来实现统计信息的获取
可是。要注意的时不同的版本号,将/proc下的每个文件里的类容会有一些区别。每个项代表什么要自己分析,最好依据top的输出去分析
然后就能够通过shell教本或者C取得CPU使用率
比方:
我的机子是AS4(Kernel 2.6.9-5)
cat /proc/stat
cpu 1047871 11079 394341 1157538880 4909104 1945 61338
cpu0 352894 2950 157917 290318045 109839 0 49564
cpu1 234860 1978 115148 288108962 2522748 1028 6391
cpu2 106253 1674 52273 288601985 2225180 909 2839
cpu3 353863 4477 69001 290509888 51337 6 2543
intr 3021292348 2939335896 720 0 12 12 0 7 2 1 0 0 0 1951 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7217173 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 74736544 0 0 0 0 0 0 0 0
0 0 0 0 0
ctxt 379682110
btime 1158715143
processes 603543
procs_running 1
procs_blocked 0
然后就能够自己计算了
- #########GetCPU.sh
- ######Author:duanjigang
- #!/bin/sh
- while true
- do
- awk '$1=="cpu"{Total=$2+$3+$4+$5+$6+$7;print "Free: " $5/Total*100"%
- " " Used: " (Total-$5)*100/Total"%"}' </proc/stat
- sleep 1
- done
复制代码
#./GetCPU.sh
Free: 99.4532% Used: 0.546814%
Free: 99.4532% Used: 0.546813%
Free: 99.4532% Used: 0.546813%
Free: 99.4532% Used: 0.546813%
这样应该能够的
shell cpu MEM====================================================================:
(1):取CPU使用率
机器:LinuxAS4 2.6.9-5.ELsmp (不通版本号的内核会有差异的)
- #cpu.sh-to get the utilization of every cpu
- #author:duanjigang<2006/12/28>
- #!/bin/sh
- awk '$0 ~/cpu[0-9]/' /proc/stat | while read line
- do
- echo "$line" | awk '{total=$2+$3+$4+$5+$6+$7+$8;free=$5;\
- print$1" Free "free/total*100"%",\
- "Used " (total-free)/total*100"%"}'
- done
复制代码
#chmod +x cpu.sh
#./cpu.sh
cpu0 Free 99.7804% Used 0.219622%
cpu1 Free 99.8515% Used 0.148521%
cpu2 Free 99.6632% Used 0.336765%
cpu3 Free 99.6241% Used 0.375855%
(2)网络流量情况
- #if.sh-to get the network flow of each interface
- #for my beloved ning
- #author:duanjigang<2006/12/28>
- #!/bin/sh
- echo "name ByteRec PackRec ByteTran PackTran"
- awk ' NR>2' /proc/net/dev | while read line
- do
- echo "$line" | awk -F ':' '{print " "$1" " $2}' |\
- awk '{print $1" "$2 " "$3" "$10" "$11}'
- done
复制代码
#./if.sh
name ByteRec PackRec ByteTran PackTran
lo 2386061 17568 2386061 17568
eth0 1159936483 150753251 190980687 991835
eth1 0 0 0 0
sit0 0 0 0 0
(3):port情况
http://bbs.chinaunix.net/viewthread.php?tid=864757&highlight=duanjigang
(4)至于内存
cat /proc/meminfo | grep "MemTotal"
cat /rpco/meninfo | grep "MemFree"
就能够了吧
安装上篇文章的原则,使用C语言写了一段程序来计算CPU和内存利用率:
/*************************************************************
le: statusinfo.c
*
* @brief: 从linux系统获取cpu及内存使用情况
*
* @version 1.0
*
***************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct PACKED //定义一个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 lowait;
unsigned int irq;
unsigned int softirq;
}CPU_OCCUPY; typedef struct __MEM
{
// unsigned char name[20];
float total;
float free;
}MEM; int get_meminfo()
{
MEM meminfo;
memset(&meminfo,0x00,sizeof(MEM));
FILE* fp = fopen("/proc/meminfo","r"); if(fp == NULL)
{
printf("Can not open file\r\n");
return 0;
} char buf[64];
char name[32];
memset(buf,0x00,sizeof(buf));
fgets(buf,sizeof(buf),fp);
sscanf(buf,"%s %f %s",name,&meminfo.total,name);
memset(buf,0x00,sizeof(buf));
fgets(buf,sizeof(buf),fp);
sscanf(buf,"%s %f %s",name,&meminfo.free,name);
printf("buf is %s name is %s %f\r\n",buf,name,meminfo.free);
float temp; sscanf(buf,"%s %f %s",name,&temp,name);
printf("temp is %f \r\n",temp);
double rate = (meminfo.total - meminfo.free)/meminfo.total;
printf("%f %f rate is %f\r\n",meminfo.total,meminfo.free,rate);
fclose(fp);
return 1;
} int cal_cpuoccupy (CPU_OCCUPY *o, CPU_OCCUPY *n)
{
unsigned long od, nd;
unsigned long id, sd;
double cpu_use = 0; od = (unsigned long) (o->user + o->nice + o->system +o->idle + o->lowait + o->irq + o->softirq);//第一次(用户+优先级+系统+空暇)的时间再赋给od
nd = (unsigned long) (n->user + n->nice + n->system +n->idle + n->lowait + n->irq + n->softirq);//第二次(用户+优先级+系统+空暇)的时间再赋给od double sum = nd - od;
double idle = n->idle - o->idle;
cpu_use = idle/sum; printf("%f\r\n",cpu_use); idle = n->user + n->system + n->nice -o->user - o->system- o->nice;
cpu_use = idle/sum; printf("%f\r\n",cpu_use);
return 0;
} void get_cpuoccupy (CPU_OCCUPY *cpust) //对无类型get函数含有一个形參结构体类弄的指针O
{
FILE *fd;
int n;
char buff[256];
CPU_OCCUPY *cpu_occupy;
cpu_occupy=cpust; fd = fopen ("/proc/stat", "r");
fgets (buff, sizeof(buff), fd);
printf("%s\r\n",buff);
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->lowait,&cpu_occupy->irq,&cpu_occupy->softirq);
printf("%s %u %u %u %u %u %u %u\r\n", cpu_occupy->name,cpu_occupy->user, cpu_occupy->nice,cpu_occupy->system, cpu_occupy->idle,cpu_occupy->lowait,cpu_occupy->irq,cpu_occupy->softirq);
printf("%s %u\r\n", cpu_occupy->name,cpu_occupy->user);
fclose(fd);
} int main()
{
CPU_OCCUPY cpu_stat1;
CPU_OCCUPY cpu_stat2;
MEM_OCCUPY mem_stat;
int cpu;
//第一次获取cpu使用情况
get_cpuoccupy((CPU_OCCUPY *)&cpu_stat1);
sleep(10); //第二次获取cpu使用情况
get_cpuoccupy((CPU_OCCUPY *)&cpu_stat2); //计算cpu使用率
cpu = cal_cpuoccupy ((CPU_OCCUPY *)&cpu_stat1, (CPU_OCCUPY *)&cpu_stat2);
printf("%d \r\n",cpu);
//获取内存
get_meminfo();
return 0;
}
编程获取linux的CPU使用的内存使用情况的更多相关文章
- Golang利用第三方包获取本机cpu使用率以及内存使用情况
第三方包下载 $ github.com/shirou/gopsutil 获取内存方面的信息 package main import ( "fmt" "github.com ...
- C/C++获取Linux系统CPU和内存及硬盘使用情况
需求分析: 不使用Top df free 等命令,利用C/C++获取Linux系统CPU和内存及硬盘使用情况 实现: //通过获取/proc/stat (CPU)和/proc/meminfo(内存 ...
- Java获取Linux系统cpu使用率
原文:http://www.open-open.com/code/view/1426152165201 import java.io.BufferedReader; import java.io.Fi ...
- linux硬件资源问题排查:cpu负载、内存使用情况、磁盘空间、磁盘IO
在使用过程中之前正常的功能,突然无法使用,性能变慢,通常都是资源消耗问题,资源消耗可以从以下几个方面去排查.对于已经安装硬件资源监控软件(zabbix)的环境,直接使用硬件资源监控软件(zabbix) ...
- 【转载】 使用宝塔Linux面板功能查看服务器内存使用情况
运维过阿里云服务器或者腾讯云服务器的运维人员都知道,针对占用内存比较高的应用或者服务等,我们需要时刻关注服务器的内存使用率,是否存在内存瓶颈等情况的出现.阿里云和腾讯云官方后台界面的监控数据页面也有相 ...
- linux下对进程按照内存使用情况进行排序
linux下对进程按照内存使用情况进行排序的命令为:ps aux --sort -rss 详细解说参见 http://alvinalexander.com/linux/unix-linux-proce ...
- php获取linux服务器CPU、内存、硬盘使用率的实现代码
define("MONITORED_IP", "172.16.0.191"); //被监控的服务器IP地址 也就是本机地址 define("DB_SE ...
- [No0000112]ComputerInfo,C#获取计算机信息(cpu使用率,内存占用率,硬盘,网络信息)
github地址:https://github.com/charygao/SmsComputerMonitor 软件用于实时监控当前系统资源等情况,并调用接口,当资源被超额占用时,发送警报到个人手机: ...
- 获取本机CPU,硬盘等使用情况
早上的时候接到主管的一个任务,要获取服务器上的cpu,硬盘, 数据库等 的使用情况,并以邮件的方式发给boss, = =没办法,公司的服务器真是不敢恭维,顺便吐槽一下公司的网速,卡的时候30k左右徘徊 ...
随机推荐
- The kth great number(set)
The kth great number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Oth ...
- 配置数据库连接池,Tomcat6.0 连接池的配置
Tomcat6.0 连接池的配置1.本人当前使用的Tomcat版本为:6.0.20,oracle为稳定的9i版本 2.下文为方便起见,依习惯以%Tomcat_Home%表示Tomcat安装的目录,本人 ...
- pthread_t结构的定义
linux下是这样定义的: 在linux的实现中pthread_t被定义为 "unsigned long int",參考这里 Windows下这样定义: /* * Generic ...
- Linux各个目录的作用
/binbin是binary的缩写.这个目录沿袭了UNIX系统的结构,存放着使用者最经常使用的命令.例如cp.ls.cat,等等./boot这里存放的是启动Linux时使用的一些核心文件./dev ...
- SQL内连接-外连接join,left join,right join,full join
1.创建测试表test1及test2 SQL)); 表已创建. SQL)); 表已创建. ,'name1'); ,'name2'); ,'name3'); ,'name4'); ,'name5'); ...
- [Python学习笔记][第四章Python字符串]
2016/1/28学习内容 第四章 Python字符串与正则表达式之字符串 编码规则 UTF-8 以1个字节表示英语字符(兼容ASCII),以3个字节表示中文及其他语言,UTF-8对全世界所有国家需要 ...
- PagedList 分页
@using PagedList.Mvc;@model PagedList.IPagedList<MvcApplicationBootStramp.Models.Person> @{ ...
- iPhone6设计自适应布局
http://www.devtalking.com/articles/adaptive-layout-for-iphone6-1/ http://www.devtalking.com/articles ...
- 从外部导入jar包的三种方式
我们在用Eclipse开发程序的时候,经常要用到第三方jar包.引入jar包不是一个小问题,由于jar包位置不清楚,而浪费时间.下面配图说明3种Eclipse引入jar包的方式. 1.最常用的普通操作 ...
- jQuery.extend函数详细用法!
最近在研究jQuery.把jQuery.extend扩展函数的用法记录下来. 1.扩展jQuery静态方法. }) 用法: $.test() 2.合并多个对象.为jQuery.extend(css1, ...