LINUX檢查一個程序記憶體增長的指令碼
阿新 • • 發佈:2019-01-13
記憶體洩露很難查。
1、記憶體有沒有洩露?
2、記憶體在哪裡洩露?
為了解決第一個問題,吾絞盡腦汁,寫了一個指令碼,檢查特定程式的記憶體增長。即只要增長就會輸出。分享出來供大家參考。
get_pid() { process_name=$1 text=`ps -A | grep $process_name` # 去掉開頭的空格 text=`echo $text | sed -e 's/^[ \t]*//g'` #沒有這個程序 if [ "${text}" = "" ] ; then pid=0 echo ${pid} return 0 fi # 得到程序號之後的空格 pos=`expr index "$text" " "` pos=`expr $pos - 1` #擷取程序號 pid=`echo $text | cut -c 1-$pos` #echo pid=---$pid+++ echo ${pid} return 0 } get_mem() { process_id=$1 text=`cat /proc/$process_id/status | grep VmRSS` #沒有這個程序 if [ "${text}" = "" ] ; then memory=0 echo ${memory} return 0 fi pos=`expr index "$text" " "` text=`echo $text | cut -c $pos-` pos=`expr index "$text" " "` pos=`expr $pos - 1` memory=`echo $text | cut -c 1-$pos` #echo memory=---$memory+++ echo ${memory} return 0 } # 最好是引數傳遞 PROCESS_NAME="quantum6" pid=$(get_pid $PROCESS_NAME) #沒有這個程序 if [ "${pid}" = "0" ] ; then max_memory=0 else max_memory=$(get_mem ${pid}) fi echo pid=${pid}, max_mem=${max_memory} # 迴圈。如果記憶體增加,輸出變化情況。 while [ true ] ; do sleep 1s # 得到程序號 pid=$(get_pid $PROCESS_NAME) if [ "${pid}" = "0" ] ; then # 沒找到,復位 max_memory=0 continue fi # 得到程序使用的記憶體。 current_memory=$(get_mem ${pid}) 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
輸出如下:
pid=15960, mem=3650724 --------------------------------- 2019年 01月 07日 星期一 09:34:57 CST 3652832 - 3650724 = 2108 ^C[[email protected] gh4ai]$ ./check_mem.sh pid=15960, mem=3650724 --------------------------------- 2019年 01月 07日 星期一 09:35:32 CST 3651776 - 3650724 = 1052 --------------------------------- 2019年 01月 07日 星期一 09:35:42 CST 3652832 - 3651776 = 1056