linux shell 打印 usage,SHELL:Find Memory Usage In Linux (统计每个程序内存使用情况)

转载一个shell统计linux系统中每个程序的内存使用情况,因为内存结构非常复杂,不一定100%精确,此shell可以在Ghub上下载。

[root@db231 ~]# ./memstat.sh

Private + Shared = RAM used Program

540.78 mb + 175.56 mb = 716.35 mb oracle(25)

24.50 mb + 327.00 kb = 24.82 mb iscsiuio

15.37 mb + 341.00 kb = 15.70 mb yum-updatesd

12.51 mb + 853.00 kb = 13.35 mb gdmgreeter

11.69 mb + 74.00 kb = 11.77 mb tnslsnr

4.74 mb + 302.00 kb = 5.03 mb Xorg

1.42 mb + 1016.00 kb = 2.41 mb smbd(2)

2.04 mb + 347.00 kb = 2.38 mb gdm-rh-security

1.83 mb + 433.00 kb = 2.25 mb sshd(2)

1.51 mb + 379.00 kb = 1.88 mb iscsid(2)

748.00 kb + 958.00 kb = 1.66 mb gdm-binary(2)

1.02 mb + 134.00 kb = 1.15 mb cupsd

...

--------------------------------------------------------

808.08 mb

========================================================

[root@db231 ~]# free

total used free shared buffers cached

Mem: 8174740 7339076 835664 0 486208 6085484

-/+ buffers/cache: 767384 7407356

Swap: 8393920 19996 8373924

memory stat shell

#!/bin/bash

# Make sure only root can run our script

if [ "$(id -u)" != "0" ]; then

echo "This script must be run as root" 1>&2

exit 1

fi

### Functions

#This function will count memory statistic for passed PID

get_process_mem ()

{

PID=$1

#we need to check if 2 files exist

if [ -f /proc/$PID/status ];

then

if [ -f /proc/$PID/smaps ];

then

#here we count memory usage, Pss, Private and Shared = Pss-Private

Pss=`cat /proc/$PID/smaps | grep -e "^Pss:" | awk '{print $2}'| paste -sd+ | bc `

Private=`cat /proc/$PID/smaps | grep -e "^Private" | awk '{print $2}'| paste -sd+ | bc `

#we need to be sure that we count Pss and Private memory, to avoid errors

if [ x"$Rss" != "x" -o x"$Private" != "x" ];

then

let Shared=${Pss}-${Private}

Name=`cat /proc/$PID/status | grep -e "^Name:" |cut -d':' -f2`

#we keep all results in bytes

let Shared=${Shared}*1024

let Private=${Private}*1024

let Sum=${Shared}+${Private}

echo -e "$Private + $Shared = $Sum \\t $Name"

fi

fi

fi

}

#this function make conversion from bytes to Kb or Mb or Gb

convert()

{

value=$1

power=0

#if value 0, we make it like 0.00

if [ "$value" = "0" ];

then

value="0.00"

fi

#We make conversion till value bigger than 1024, and if yes we divide by 1024

while [ $(echo "${value} > 1024"|bc) -eq 1 ]

do

value=$(echo "scale=2;${value}/1024"|bc)

let power=$power+1

done

#this part get b,kb,mb or gb according to number of divisions

case $power in

0) reg=b;;

1) reg=kb;;

2) reg=mb;;

3) reg=gb;;

esac

echo -n "${value} ${reg} "

}

#to ensure that temp files not exist

[[ -f /tmp/res ]] && rm -f /tmp/res

[[ -f /tmp/res2 ]] && rm -f /tmp/res2

[[ -f /tmp/res3 ]] && rm -f /tmp/res3

#if argument passed script will show statistic only for that pid, of not we list all processes in /proc/ #and get statistic for all of them, all result we store in file /tmp/res

if [ $# -eq 0 ]

then

pids=`ls /proc | grep -e [0-9] | grep -v [A-Za-z] `

for i in $pids

do

get_process_mem $i >> /tmp/res

done

else

get_process_mem $1>> /tmp/res

fi

#This will sort result by memory usage

cat /tmp/res | sort -gr -k 5 > /tmp/res2

#this part will get uniq names from process list, and we will add all lines with same process list

#we will count nomber of processes with same name, so if more that 1 process where will be

# process(2) in output

for Name in `cat /tmp/res2 | awk '{print $6}' | sort | uniq`

do

count=`cat /tmp/res2 | awk -v src=$Name '{if ($6==src) {print $6}}'|wc -l| awk '{print $1}'`

if [ $count = "1" ];

then

count=""

else

count="(${count})"

fi

VmSizeKB=`cat /tmp/res2 | awk -v src=$Name '{if ($6==src) {print $1}}' | paste -sd+ | bc`

VmRssKB=`cat /tmp/res2 | awk -v src=$Name '{if ($6==src) {print $3}}' | paste -sd+ | bc`

total=`cat /tmp/res2 | awk '{print $5}' | paste -sd+ | bc`

Sum=`echo "${VmRssKB}+${VmSizeKB}"|bc`

#all result stored in /tmp/res3 file

echo -e "$VmSizeKB + $VmRssKB = $Sum \\t ${Name}${count}" >>/tmp/res3

done

#this make sort once more.

cat /tmp/res3 | sort -gr -k 5 | uniq > /tmp/res

#now we print result , first header

echo -e "Private \\t + \\t Shared \\t = \\t RAM used \\t Program"

#after we read line by line of temp file

while read line

do

echo $line | while read a b c d e f

do

#we print all processes if Ram used if not 0

if [ $e != "0" ]; then

#here we use function that make conversion

echo -en "`convert $a` \\t $b \\t `convert $c` \\t $d \\t `convert $e` \\t $f"

echo ""

fi

done

done < /tmp/res

#this part print footer, with counted Ram usage

echo "--------------------------------------------------------"

echo -e "\\t\\t\\t\\t\\t\\t `convert $total`"

echo "========================================================"

# we clean temporary file

[[ -f /tmp/res ]] && rm -f /tmp/res

[[ -f /tmp/res2 ]] && rm -f /tmp/res2

[[ -f /tmp/res3 ]] && rm -f /tmp/res3

--注意全角引号

[oracle@dbserver89 ~]$ pmap -d 5502

5502: oracleora11g (LOCAL=NO)

Address Kbytes Mode Offset Device Mapping

0000000000400000 183540 r-x-- 0000000000000000 008:00006 oracle

000000000b93c000 1884 rwx-- 000000000b33c000 008:00006 oracle

000000000bb13000 304 rwx-- 000000000bb13000 000:00000 [ anon ]

000000001819f000 544 rwx-- 000000001819f000 000:00000 [ anon ]

0000000060000000 32768 rwxs- 0000000000000000 000:0000c 13 (deleted)

ffffffffff600000 8192 ----- 0000000000000000 000:00000 [ anon ]

...

mapped: 4753296K writeable/private: 8536K shared: 4507648K

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值