原文出处 https://quantum6.blog.csdn.net/article/details/85985274
经过测试修改,修复BUG(若脚本PID比进程PID值小,会导致检测到的内存为脚本进程,脚本进程调用grep时,也会导致脚本检测到grep进程)
PROCESS_NAME=$1
if [ "${PROCESS_NAME}" = "" ] ; then
echo PROCESS_NUME err, usage ./xxxx.sh PROCESS_NAME
exit
fi
# 删除"./"特殊符号,[./]则是删除"." || "/"
FILE_NAME=$(echo $0 | sed 's/[.][/]//g')
echo FILE_NAME=$FILE_NAME PROCESS_NAME=$PROCESS_NAME
#删除grep所在的行, 删除本脚本运行所在的行,打印每行的第一列参数
pid=$(ps -A | grep $PROCESS_NAME | sed -e '/grep/d' -e '/'"$FILE_NAME"'/d' | awk '{print $1}')
#没有这个进程
if [ "${pid}" = "" ] ; then
max_memory=0
pid=0
else
max_memory=$(cat /proc/${pid}/status | grep VmRSS | awk '{print $2}')
fi
echo pid=${pid}, max_mem=${max_memory}
# 循环。如果内存增加,输出变化情况。
while [ true ] ; do
sleep 1s
# 得到进程号
pid=$(ps -A | grep $PROCESS_NAME | sed -e '/grep/d' -e '/'"$FILE_NAME"'/d' | awk '{print $1}')
if [ "${pid}" = "" ] ; then
# 没找到,复位
max_memory=0
continue
fi
# 得到进程使用的内存。
# cat /proc/${pid}/status | grep VmRSS | awk '{print $2}'
current_memory=$(cat /proc/${pid}/status | grep VmRSS | awk '{print $2}')
if [ "${current_memory}" = "0" ] ; then
continue
fi
# 如果占用内存增加了,输出
if [ ${current_memory} -gt ${max_memory} ] ; then
echo
echo ---------------------------------
date
diff=`expr ${current_memory} - ${max_memory}`
echo ${current_memory} - ${max_memory} = ${diff}
max_memory=${current_memory}
fi
done