1 #!/bin/bash 2 process=(iss_server DbsServer.out) 3 4 x=0 5 while true 6 do 7 i=0 8 while (($i<${#process[*]})) 9 do 10 11 pname=${process[$i]} 12 pn=`echo ${pname:0:3}|tr ‘[A-Z]‘ ‘[a-z]‘` 13 14 pid=`ps -ef|grep $pname|grep -v grep|awk ‘{print $2}‘` 15 cpu=`ps -p $pid -o pcpu --no-headers|sed "s/[[:space:]]//g"` 16 mem=`ps -p $pid -o pmem --no-headers|sed "s/[[:space:]]//g"` 17 if [ $x == 0 ] 18 then 19 echo `date`>>${pn}_cpumem.txt 20 echo "$pname:pid=$pid,maxcpu=$cpu,mincpu=$cpu,maxmem=$mem,minmem=$mem;">>${pn}_cpumem.txt 21 eval ${pn}_maxcpu=$cpu 22 eval ${pn}_mincpu=$cpu 23 eval ${pn}_maxmem=$mem 24 eval ${pn}_minmem=$mem 25 eval ${pn}_pid=$pid 26 else 27 rpid=`eval echo ‘$‘${pn}_pid` 28 rmaxcpu=`eval echo ‘$‘${pn}_maxcpu` 29 rmincpu=`eval echo ‘$‘${pn}_mincpu` 30 rmaxmem=`eval echo ‘$‘${pn}_maxmem` 31 rminmem=`eval echo ‘$‘${pn}_minmem` 32 if [ $rpid != $pid ];then 33 eval ${pn}_pid=$pid 34 echo "$pname:pid changed,now pid=$pid">>${pn}_cpumem.txt 35 fi 36 if [ `echo $cpu\>$rmaxcpu | bc` -eq 1 ];then 37 eval ${pn}_maxcpu=$cpu 38 echo "$pname:pid=$pid,maxcpu=$cpu;">>${pn}_cpumem.txt 39 elif [ `echo $cpu\<$rmincpu | bc` -eq 1 ];then 40 eval ${pn}_mincpu=$cpu 41 echo "$pname:pid=$pid,mincpu=$cpu;">>${pn}_cpumem.txt 42 fi 43 if [ `echo $mem\>$rmaxmem | bc` -eq 1 ];then 44 eval ${pn}_maxmem=$mem 45 echo "$pname:pid=$pid,maxmem=$mem;">>${pn}_cpumem.txt 46 elif [ `echo $mem\<$rminmem | bc` -eq 1 ];then 47 eval ${pn}_minmem=$mem 48 echo "$pname:pid=$pid,minmem=$mem;">>${pn}_cpumem.txt 49 fi 50 fi 52 i=`expr $i+1` 53 done 54 x=1 55 sleep 10 56 done
1、使用数组存储指定进程,这里指定了两个进程;
process=(iss_server DbsServer.out)
2、使用命令分别获取进程pid、cpu和内存,其中sed "s/[[:space:]]//g"是为了去除值中的空格,比如进程cpu是2.3%,取出值【 2.3】前面含有空格,导致后面赋值语句报错;
1 pid=`ps -ef|grep $pname|grep -v grep|awk ‘{print $2}‘` 2 cpu=`ps -p $pid -o pcpu --no-headers|sed "s/[[:space:]]//g"` 3 mem=`ps -p $pid -o pmem --no-headers|sed "s/[[:space:]]//g"`
3、这里的x是为了判断是否首次获取,(=0是首次,=1非首次,见第4行和54行)如果是首次获取,则给各进程的最大值和最小值赋初值,其中,eval命令是为了二次解析复杂变量,如果没有eval,只有等号右边的值能被解析,${pn}就不能解析;
1 if [ $x == 0 ] 2 then 3 echo `date`>>${pn}_cpumem.txt 4 echo "$pname:pid=$pid,maxcpu=$cpu,mincpu=$cpu,maxmem=$mem,minmem=$mem;">>${pn}_cpumem.txt 5 eval ${pn}_maxcpu=$cpu 6 eval ${pn}_mincpu=$cpu 7 eval ${pn}_maxmem=$mem 8 eval ${pn}_minmem=$mem 9 eval ${pn}_pid=$pid 10 else 11 。。。 12 fi
4、比较原pid和当前pid,如果pid变化,进程可能崩溃重启过;取原有最大最小值,与当前值进行比较,其中,资源值因为是小数,不能使用-gt之类的进行比较,所以借用bc语言工具进行小数之间的比较;
1 rpid=`eval echo ‘$‘${pn}_pid` 2 rmaxcpu=`eval echo ‘$‘${pn}_maxcpu` 3 rmincpu=`eval echo ‘$‘${pn}_mincpu` 4 rmaxmem=`eval echo ‘$‘${pn}_maxmem` 5 rminmem=`eval echo ‘$‘${pn}_minmem` 6 if [ $rpid != $pid ];then 7 eval ${pn}_pid=$pid 8 echo "$pname:pid changed,now pid=$pid">>${pn}_cpumem.txt 9 fi 10 if [ `echo $cpu\>$rmaxcpu | bc` -eq 1 ];then 11 eval ${pn}_maxcpu=$cpu 12 echo "$pname:pid=$pid,maxcpu=$cpu;">>${pn}_cpumem.txt 13 elif [ `echo $cpu\<$rmincpu | bc` -eq 1 ];then 14 eval ${pn}_mincpu=$cpu 15 echo "$pname:pid=$pid,mincpu=$cpu;">>${pn}_cpumem.txt 16 fi 17 if [ `echo $mem\>$rmaxmem | bc` -eq 1 ];then 18 eval ${pn}_maxmem=$mem 19 echo "$pname:pid=$pid,maxmem=$mem;">>${pn}_cpumem.txt 20 elif [ `echo $mem\<$rminmem | bc` -eq 1 ];then 21 eval ${pn}_minmem=$mem 22 echo "$pname:pid=$pid,minmem=$mem;">>${pn}_cpumem.txt 23 fi
5、使用i值作为下标,数组下标从0开始,${#process[*]}取出的值是进程数组的长度;
7 i=0 8 while (($i<${#process[*]})) 9 do 。。。 51 i=`expr $i+1` 52 done
6、隔十秒取一次资源值
55 sleep 10
7、最外层是使用一个无限循环不断取值。
#调试脚本使用命令 sh -x cpumem.sh #不中断的在后台运行 setsid ./cpumem.sh & #查看脚本进程 ps -ef |grep cpumem.sh
8、需完善功能:①对于一个进程名查找出多个进程的情况,需要实现筛选机制;②输出结果仍然比较冗余,需要实现将所有进程最终最大值和最小值分别以一条记录的形式展现;记录每一次的pid的改变和改变时间;③需要实现指定脚本运行时间,不需要手动kill掉脚本进程;④系统关机后脚本需要能自启动。
原文:https://www.cnblogs.com/cyanlee/p/11710752.html