循环监控一个教学进程怎么写,此教学进程怎么写出现即结束,要怎么写

一个监控指定进程的脚本
发布时间: 5:38:09
编辑:www.fx114.net
本篇文章主要介绍了"一个监控指定进程的脚本",主要涉及到一个监控指定进程的脚本方面的内容,对于一个监控指定进程的脚本感兴趣的同学可以参考一下。
这个脚本,根据输入的进程的关键字自动查找相关的进程PID,然后做相应的处理
#!/bin/bash
######coded&by&jackyvan#######
######blog:blog.csdn.net/jackyvan########
if&[&"$#"&-eq&1&]&#必须有一个输入参数当作查询的关键字
&&&&while&[&1&];&do
&&&&&&&&ps&-ef&&&tempps.tmp&#把ps的结果存入一临时文件
&&&&&&&&exec&3&tempps.tmp&#重定向管道
&&&&&&&&while&read&-u3&line&#从重定向管道循环读取&每次一行
&&&&&&&&do
&&&&&&&&&&&&pid=`echo&$line&|&awk&'$8~/'"$1"'/&{print&$2}'`&#取到pid
&&&&&&&&&&&&if&[&"$pid"&!=&""&]
&&&&&&&&&&&&then
&&&&&&&&&&&&&&&&#根据需要自己处理
&&&&&&&&&&&&fi
&&&&&&&&done
&&&&&&&&exec&3&&-
&&&&&&&&sleep&3&#休眠时间&秒
版权声明:本文为博主原创文章,未经博主允许不得转载。
本文标题:
本页链接:linux下如何监控一个进程的cpu使用率
linux下如何监控一个进程的cpu使用率
一、问题的提出:前一阵子由于工作的需要正在学习关于系统资源监控方面的一些知识!由于本人的水平比较的有限,所以也是翻阅了比较多的书籍,包括查阅了top命令的源代码,大致上知道我们要获取的监控数据,完全可以从proc中读取出来,现为了简单的描述一下解决问题的过程,在这里我们假设有这样一个问题:如何监控firefox这个应用程序的cpu使用率?二、问题的分析:问题提出来了,我们应该如何着手呢?首先,我们通过查阅相关的资料知道了可以从proc中获取我们的数据。所以我就先去proc下面去看看我们要找的东西在哪里? 点击(此处)折叠或打开cd /procls我们会看到如下的一些东西: 点击(此处)折叠或打开1
pagetypeinfo
partitions
sched_debug
execdomains
filesystems
interrupts
sysrq-trigger
timer_list12
timer_stats
kpagecount
kpageflags
latency_stats
version140
version_signature
vmallocinfo
zoneinfo15
misc这些都是一些什么玩意呢?看得有点晕,仔细看一下,这个有编号的就是我们系统中正在运行的进程的pid呀?我们们随便打开一个看看这编号的文件夹下面都是什么东西呢? 点击(此处)折叠或打开cd 1121我们会看到如下东西: 点击(此处)折叠或打开attr
clear_refs
taskautogroup
personality
mountstats
statuscgroup
coredump_filter
oom_score_adj
syscall在里面我们可以看到一个叫做“stat”的文件,上网搜索一下这个文件内容,我们知道stat中记录了我们cpu的使用情况!这个真是大快人心呀,这么简单就把这个关键给找到了,下一步我们只需要找到firefox的进程id然后进入到目录下读取stat文件中的内容,然后按照之前有一篇文章(http://blog.chinaunix.net/uid--id-3255096.html)中记录的计算cpu使用率的方法,把它计算出来!我们不禁要问一下是不是这样问题就解决了呢?我们更一步的想一下,有两点值得我们注意:1、该进程pid目录下的stat文件记录的是该进程的cpu使用情况不假,但是假如该进程有子进程怎么办呢?2、就是上一篇文章的计算方法存在缺陷:就是他计算的是一个从开机都现在平均使用率,而我们更多是需要关注的是一个进程的实时的资源使用情况,如何获取一个实时的统计?显然到了这里我们要实现一个应用程序的资源使用情况的监控,必须要解决这两个问题:对于第一个问题,既然/proc下记录了所有进程的资源使用情况,我们是不是可以把一个进程的所有子进程的资源使用情况做和,就能够得到该进程的总的资源使用情况呢?答案是肯定的!但是如何来获取一个进程的子进程呢?更进一步来说如何通过一个进程的pid来获取它的所有子进程的pid呢?这显然是一个递归的问题,因为一个进程的子进程下还有可能会有子进程,我们通过什么样的方法才能把这些子进程都给他找出来呢?这里就用到了我们的shell命令: 点击(此处)折叠或打开ps h --ppid 2325 -o pid我们通过这个命令就可以得到进程2325的子进程,要得到一个进程的所有子进程我们只需要递归的执行这条命令就可以了,如何来递归的实现呢,其实并不是很困难,我们只需要写一个递归的函数,然后在里面循环的调用这条shell命令就行了: 点击(此处)折叠或打开void child(const pid_t pid, vector&pid_t& &pvec){&&&&FILE *file;&&&&char buf[MAXLINE];&&&&pid_t cpid;&&&&stringstream ss;&&&&stringstream shell;&&&&pvec.push_back(pid);&&&&shell.str("");&&&&shell.clear();&&&&shell && "ps h --ppid ";&&&&shell && pid;&&&&shell && " -o pid";&&&&file = popen(shell.str().c_str(),"r");&&&&if(file != NULL)&&&&{&&&&&&&&while(fgets(buf,MAXLINE,file) != NULL)&&&&&&&&{&&&&&&&&&&&&ss && buf;&&&&&&&&}&&&&&&&&while(ss && cpid)&&&&&&&&{&&&&&&&&&&&&child(cpid,pvec);&&&&&&&&}&&&&}}通过上述的执行之后我们就可以得到一个进程的所有子进程,这样就解决了第一个问题!下面来考虑第二个问题!既然我们要尽可能的得到一个实时的资源监控,我们就需要在一定的时间间隔之内不断的读取cpu的使用情况来计算cpu的使用率,既然stat中记录的是该进程启动开始到提取时刻的cpu使用情况,我们就需要记录上次监控的数据,然后两次做差!三、问题的实现:有了上面的分析我们来实现这个程序,就不算困难了:定义一个通用的资源监控对象: 点击(此处)折叠或打开/*&*当前版本:2.0&*作
者:ddx&*完成日期:日&*/#ifndef&&&&JSFPROBER_H#define JSFPROBER_H#include&string&using namespace std;class JsfProber{&&&&public:&&&&virtual double probe(){return 0.0;}&&&&virtual double probe(const pid_t pid){return 0.0;}&&&&string name;};JsfProber* getProber();#endif具体实现: 点击(此处)折叠或打开/*************************************************************************&&&&& File Name: jobcpuprober.cpp&&&&& Author: dongdaoxiang&&&&& Mail: dongdaoxiang@ncic.ac.cn &&&&& Created Time: 日 星期二 14时10分54秒&************************************************************************/#include &stdio.h&#include "jsfprober.h"#include &iostream&#include &vector&#include &sstream&#include &string&#include &cstring&using namespace std;#define MAXLINE 1024void child(const pid_t pid, vector&pid_t& &pvec){&&&&FILE *file;&&&&char buf[MAXLINE];&&&&pid_t cpid;&&&&stringstream ss;&&&&stringstream shell;&&&&pvec.push_back(pid);&&&&shell.str("");&&&&shell.clear();&&&&shell && "ps h --ppid ";&&&&shell && pid;&&&&shell && " -o pid";&&&&file = popen(shell.str().c_str(),"r");&&&&if(file != NULL)&&&&{&&&&&&&&while(fgets(buf,MAXLINE,file) != NULL)&&&&&&&&{&&&&&&&&&&&&ss && buf;&&&&&&&&}&&&&&&&&while(ss && cpid)&&&&&&&&{&&&&&&&&&&&&child(cpid,pvec);&&&&&&&&}&&&&}}class JobCpuProber:public JsfProber{&&&&public:&&&&&&&&JobCpuProber();&&&&&&&&double probe(const pid_t pid);&&&&private:&&&&&&&&string jobname;&&&&&&&&double ljobtotal;&&&&&&&&double ltotal;};JobCpuProber::JobCpuProber(){&&&&jobname = "jobname";&&&&ljobtotal = 0;&&&&ltotal = 0;}double JobCpuProber::probe(const pid_t pid){&&&&stringstream ss,shell;&&&&double cutime;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//current time job spending in user mode&&&&double cstime;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//current time job spending in sys mode&&&&double starttime;
//the start time of the job&&&&double total = 0.0;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //the total cpu time&&&&double temp = 0.0;&&&&double cjobtotal = 0.0;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //the total job time&&&&double result = 0.0;&&&&FILE *file;&&&&vector&pid_t& pvec;&&&&char buf[MAXLINE];&&&&child(pid,pvec);&&&&for(vector&pid_t&::iterator it = pvec.begin(); it != pvec.end(); it++)&&&&{&&&&&&&&shell.str("");&&&&&&&&shell.clear();&&&&&&&&shell && "cat /proc/";&&&&&&&&shell && *it;&&&&&&&&shell && "/stat | cut -d ' ' -f14,15";&&&&&&&&file = popen(shell.str().c_str(),"r");
//get the process children's cutime cstime&&&&&&&&if(file == NULL)&&&&&&&&{&&&&&&&&&&&&cout && "popen err please check 83th row" && endl;&&&&&&&&&&&&return -1;&&&&&&&&}&&&&&&&&memset(buf,0,sizeof(char)*MAXLINE);&&&&&&&&ss.str("");&&&&&&&&ss.clear();&&&&&&&&if(fgets(buf,MAXLINE,file) != NULL)&&&&&&&&{&&&&&&&&&&&&ss && buf;&&&&&&&&}&&&&&&&&pclose(file);&&&&&&&&ss && cutime;&&&&&&&&ss && cstime;&&&&&&&&cjobtotal += cutime + cstime;
//get the cjobtotal&&&&}&&&&shell.str("");&&&&shell.clear();&&&&shell && "grep -w cpu /proc/stat | cut -d ' ' -f3,4,5,6,7,8,9";&&&&file = popen(shell.str().c_str(),"r");
//get the total cpu time&&&&if(file == NULL)&&&&{&&&&&&&&cout && "popen err please check the 104th row!!" && endl;&&&&&&&&return -1;&&&&}&&&&memset(buf,0,sizeof(char)*MAXLINE);&&&&ss.str("");&&&&ss.clear();&&&&if(fgets(buf,MAXLINE,file) != NULL)&&&&{&&&&&&&&ss && buf;&&&&}&&&&while(ss && temp)&&&&{&&&&&&&&total += temp;&&&&}&&&&cout && "total: " && total && endl;&&&&cout && "cjobtotal: " && cjobtotal && endl;&&&&result = ((cjobtotal - ljobtotal)/(total - ltotal))*100; //calc the job cpurate &&&&ljobtotal = cjobtotal;&&&&ltotal = total;&&&&return result;}JsfProber* getProber(){&&&&JsfProber* p = new JobCpuProber();&&&&return p;}这样我们就实现了我们的监控,希望可以对大家有些启发!!!
发表评论:
TA的最新馆藏[转]&习题解答第4章_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
习题解答第4章
上传于||文档简介
&&南​京​邮​电​大​学​计​算​机​学​院​操​作​系​统​习​题​答​案​第章
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩10页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢}

我要回帖

更多关于 论文进程怎么写 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信