linux监测指定进程的CPU及物理内存消耗情况(bash脚本)

近日,由于工作要求,研究了一下如何在linux系统下对某个指定的单个进程进行监测,分析其CPU及物理内存的使用情况,并基于bash脚本写了一个独立的模块,完整的实现上述功能。现将整个模块的代码贴上,以便日后借鉴,并与同道中人分享。源码在ubuntu 16.04、嵌入式主板等多个系统下运行亲测正常。
注:另有一份代码是基于c语言的,同样实现上述的功能,贴于另一篇博客,如有需要,可点击此处跳转。

#!/bin/bash

#用法:输入“./monitor.sh compiz 1”或者“./monitor.sh compiz 1 logon”
#其中:compiz表示要监控的进程名称,1表示要刷新的时间间隔,logon表示将监测数据同步输出到记录文件中,该参数为可选参数,如果不写则表示不输出到记录文件

PROG_NAME=$1
SLEP_TIME=$2
LOG_ENABL=$3
SDIR_PATH="monitor_log"
FILE_NAME=${PROG_NAME}_$(date "+%Y%m%d_%H%M%S").log

if [ "$LOG_ENABL" = "logon" ];then
	if [ ! -d ${SDIR_PATH} ];then
		mkdir ${SDIR_PATH}
	fi
	cd ${SDIR_PATH}
	echo "log is enabled. log_file \"${FILE_NAME}\""
fi

pre_pro_cpu=""
pre_sys_cpu=""

while [ 1 ]
do
	PID=$(ps -A | grep $PROG_NAME | grep -v 'grep' | awk '{print $1;}')
	time=$(date "+%Y/%m/%d %H:%M:%S")
	
	if [ "$PID" != "" ];then
		pro_tu_time=$(cat /proc/$PID/stat | awk -F " " '{print $14}')
		pro_ts_time=$(cat /proc/$PID/stat | awk -F " " '{print $15}')
		pro_cu_time=$(cat /proc/$PID/stat | awk -F " " '{print $16}')
		pro_cs_time=$(cat /proc/$PID/stat | awk -F " " '{print $17}')
		cur_prc_cpu=$((10#${pro_tu_time}+10#${pro_ts_time}+10#${pro_cu_time}+10#${pro_cs_time}))
		
		sys_us_time=$(cat /proc/stat | awk -F " " '{print $2}' | sed -n '1p')
		sys_ni_time=$(cat /proc/stat | awk -F " " '{print $3}' | sed -n '1p')
		sys_sy_time=$(cat /proc/stat | awk -F " " '{print $4}' | sed -n '1p')
		sys_id_time=$(cat /proc/stat | awk -F " " '{print $5}' | sed -n '1p')
		cur_sys_cpu=$((10#${sys_us_time}+10#${sys_ni_time}+10#${sys_sy_time}+10#${sys_id_time}))
		
		if [ "${pre_pro_cpu}" = "" ];then
			dif_pre_cpu=0
			dif_cur_cpu=1
		else
			dif_pre_cpu=$(((10#${cur_prc_cpu}-10#${pre_pro_cpu})))
			dif_cur_cpu=$(((10#${cur_sys_cpu}-10#${pre_sys_cpu})))			
		fi
		
		cpu_value=`awk -v x=${dif_pre_cpu} -v y=${dif_cur_cpu} 'BEGIN{printf "%.2f\n",100*x/y}'`
		pre_pro_cpu=${cur_prc_cpu}
		pre_sys_cpu=${cur_sys_cpu}
		
		mem_value=$(cat /proc/$PID/status | grep RSS | awk -F " " '{print $2}')
		disp="[${time}] cpu ${cpu_value}%, mem ${mem_value} KB"
	else
		disp="[${time}] proc \"${PROG_NAME}\" not found!!!"
	fi
	
	echo "${disp}"
	
	if [ "$LOG_ENABL" = "logon" ];then
		echo ${disp} >> "$FILE_NAME"
	fi
	
	sleep ${SLEP_TIME}
done
发布了165 篇原创文章 · 获赞 760 · 访问量 158万+

猜你喜欢

转载自blog.csdn.net/LEON1741/article/details/87098405
今日推荐