linux 进程 内存使用监控

使用shell脚本来监控进程的内存使用情况

#!/bin/bash

PROCESS=$1
LOG="/mnt/log/"
PFEX="_mem.log"
LOG_PATH=$LOG$PROCESS$PFEX
echo $LOG_PATH
sleep 10

if [ -f "$LOG_PATH" ];then
	rm "$LOG_PATH"
fi

PID=$(ps | grep $PROCESS | grep -v 'grep' | grep -v 'watch_mem.sh' | awk '{print $1;}')
echo $PID
while [ $PID != "" ]
do
	echo $PID
	pmap -d $PID | sed -n '/writeable/p' >> $LOG_PATH
	sleep 60
	PID=$(ps | grep $PROCESS | grep -v 'grep' | grep -v 'watch_mem.sh' | awk '{print $1;}')
done
	

这一句是根据进程名字来找出进程ID,因为监控内存使用是用进程ID来监控的

PID=$(ps | grep $PROCESS | grep -v 'grep' | awk '{print $1;}')

这里有两个命令需要讲解清楚

1. grep命令   grep全称是Global Regular Expression Print,表示全局正则表达式版本

    格式及主要参数
    grep [options]
    主要参数:  grep --help可查看
        -c:只输出匹配行的计数。
        -i:不区分大小写。
        -h:查询多文件时不显示文件名。
        -l:查询多文件时只输出包含匹配字符的文件名。
        -n:显示匹配行及 行号。
        -s:不显示不存在或无匹配文本的错误信息。
        -v:显示不包含匹配文本的所有行。
        --color=auto :可以将找到的关键词部分加上颜色的显示。
 

2. awk awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理

awk '{print $1;}'

按照空格切开,返回第一列信息

3. pmap 命令  report memory map of a process(查看进程的内存映像信息)

pmap -d $PID | sed -n '/writeable/p' >> $LOG

查看init进程

root@LBS:/tmp/rsys/bin# pmap -d 1
1:   init     
Address   Kbytes Mode  Offset           Device    Mapping
00008000     388 r-x-- 0000000000000000 000:00001 busybox
00071000       4 rw--- 0000000000061000 000:00001 busybox
00072000     140 rw--- 0000000000000000 000:00000   [ anon ]
2aaf4000     124 r-x-- 0000000000000000 000:00001 ld-2.11.1.so
2ab13000       4 rw--- 0000000000000000 000:00000   [ anon ]
2ab1a000       4 r---- 000000000001e000 000:00001 ld-2.11.1.so
2ab1b000       4 rw--- 000000000001f000 000:00001 ld-2.11.1.so
2ab26000       4 rw--- 0000000000000000 000:00000   [ anon ]
2ab93000       4 rw--- 0000000000000000 000:00000   [ anon ]
2ab98000      44 r-x-- 0000000000000000 000:00001 libgcc_s.so.1
2aba3000      28 ----- 000000000000b000 000:00001 libgcc_s.so.1
2abaa000       4 rw--- 000000000000a000 000:00001 libgcc_s.so.1
2abac000      44 r-x-- 0000000000000000 000:00001 libcrypt-2.11.1.so
2abb7000      28 ----- 000000000000b000 000:00001 libcrypt-2.11.1.so
2abbe000       4 r---- 000000000000a000 000:00001 libcrypt-2.11.1.so
2abbf000       4 rw--- 000000000000b000 000:00001 libcrypt-2.11.1.so
2abc0000     156 rw--- 0000000000000000 000:00000   [ anon ]
2abe7000     624 r-x-- 0000000000000000 000:00001 libm-2.11.1.so
2ac83000      28 ----- 000000000009c000 000:00001 libm-2.11.1.so
2ac8a000       4 r---- 000000000009b000 000:00001 libm-2.11.1.so
2ac8b000       4 rw--- 000000000009c000 000:00001 libm-2.11.1.so
2ac8c000    1252 r-x-- 0000000000000000 000:00001 libc-2.11.1.so
2adc5000      32 ----- 0000000000139000 000:00001 libc-2.11.1.so
2adcd000       8 r---- 0000000000139000 000:00001 libc-2.11.1.so
2adcf000       4 rw--- 000000000013b000 000:00001 libc-2.11.1.so
2add0000      12 rw--- 0000000000000000 000:00000   [ anon ]
7e9b9000     132 rw--- 0000000000000000 000:00000   [ stack ]
ffff0000       4 r-x-- 0000000000000000 000:00000   [ anon ]
mapped: 3092K    writeable/private: 476K    shared: 0K

最后一行

mapped 表示该进程映射的虚拟地址空间大小,也就是该进程预先分配的虚拟内存大小,即ps出的vsz
writeable/private  表示进程所占用的私有地址空间大小,也就是该进程实际使用的内存大小      
shared 表示进程和其他进程共享的内存大小

4. sed 命令 

sed -n '/writeable/p'

上面这条命令是选出 pmap -d 的最后一行信息

发布了80 篇原创文章 · 获赞 19 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qiukapi/article/details/104532209