使用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 的最后一行信息