Linux下实现脚本监测特定进程占用内存情况
Linux系统下,我们可以利用以下命令来获取特定进程的运行情况:
cat /proc/$PID/status
其中PID是具体的进程号,这个命令打印出/proc/特定进程/status文件的内容,信息比较多,包含了物理内存/虚拟内存的使用状况,监控进程是否有内存泄露的问题,一般查看进程占用物理内存的情况:
VmRSS: xxxkB
可以采用grep命令过滤出我们需要的信息:
cat /proc/$PID/status | grep RSS >> "$LOG" #过滤包含RSS的行,并且重定向到参数LOG表示的文件
由于PID号需要通过进程名获取,同样使用grep命令过滤出我们指定进程的进程号:
ps | grep $PROCESS | grep -v 'grep' | awk '{print $1;}'#$PROCESS表示进程名字
再设置一个循环,每十秒获取一次信息并写入指定文件,完整的脚本如下:.
#!/bin/bash PROCESS=进程名
LOG="/mnt/memlog.txt" sleep #删除上次的监控文件
if [ -f "$LOG" ];then
rm "$LOG"
fi #过滤出需要的进程ID
PID=$(ps | grep $PROCESS | grep -v 'grep' | awk '{print $1;}') while [ "$PID" != "" ]
do
cat /proc/$PID/status | grep RSS >> "$LOG"#过滤出VmRSS行
sleep
PID=$(ps | grep $PROCESS | grep -v 'grep' | awk '{print $1;}')
done
范例2
shell脚本1.
#!/bin/bash
pid=$ #获取进程pid
echo $pid
interval= #设置采集间隔
while true
do
echo $(date +"%y-%m-%d %H:%M:%S") >> proc_memlog.txt
cat /proc/$pid/status|grep -e VmRSS >> proc_memlog.txt #获取内存占用
cpu=`top -n -p $pid|tail -|head -|awk '{ssd=NF-4} {print $ssd}'` #获取cpu占用
echo "Cpu: " $cpu >> proc_memlog.txt
echo $blank >> proc_memlog.txt
sleep $interval
done
调用方式
$ sh shellName.sh [pid]
#exp:
sh monitor.sh 1234
脚本1-meminfo.sh:
#!/bin/bash
interval=
if [ "$1" != "" ]
then
interval=$
fi
echo "检查时间间隔(单位秒):"$interval
datetime=`date +'%Y%m%d'`
echo""> /home/info/info-$datetime
while :
do
echo `date +'%Y%m%d %H:%M:%S'` >> /home/info/info-$datetime
cat /proc/meminfo | grep -E 'MemTotal|MemFree|Cached' |grep -v SwapCached|xargs >>/home/info/info-$datetime
top -b -d -n |grep -E "PID.*USER|load|Cpu|Data" >> /home/info/info-$datetime
sleep $interval
echo "-------------------------------------" >> /home/info/info-$datetime
done
注释:
第2-5行:设定一个内存监测时间间隔,如果用户输入,则为用户输入的值,如果用户没有输入,则默认为60s监测一次($1为我们执行程序是给程序的第一个参数)
第8行:datetime=date +'%Y%m%d' 通过date命令获取系统时间,并赋给datetime。变量date命令格式:date [选项]… [+格式]。
注意:一定要加反引号(),反引号在Linux中起着命令替换的作用。写成单引号和双引号会把命令当成字符串输出的哟!
第13行:首先查看meminfo文件中的内容,通过管道传递给grep命令,通过-E选项筛选出包含MemTotal或MemFree或Cached的内容(grep -E 选项可以用来扩展选项为正则表达式),并传递给下一个grep命令,通过-v选项排除掉包含SwapCached的内容,最后通过xargs将内容输出到文件(xargs将多行变成了单行,见下图)。
第14行:通过top查看内存使用情况,并通过grep过滤后输出到文件
运行脚本:./meminfo.sh [args1]
最后输出结果:cat /home/info/info-20170629
http://www.cnblogs.com/franjia/p/4384362.html
http://man.linuxde.net/xargs
脚本2
这个程序只是监测了top中的RES值,输出简单,并且可以在内存不在变化时自动停止监测(不过这个也有弊端,因为有些程序不是一直稳定增长的,很可能稳定一下,又增长了,这时候程序就停了)。.
同时会打屏输出:
#截取top的内存使用数
#如果文件存在,重命名
if [ -a memory.txt ]
then
mv memory.txt memory_at_`date +%H:%M:%S`.txt
fi
#如果没有输入参数,默认60s检查一次
if [ $# -eq ]
then
DREAM=
else
DREAM=$
fi
echo "检查内存时间间隔(秒):${DREAM}"
#当前内存数
RES_NOW=
#上一次内存数
RES_BEF=
#一致时退出
while [ $RES_NOW -ne $RES_BEF ]
do
RES_BEF=$RES_NOW
#取现在内存
RES_NOW=$(top -d -n |grep 'DataAccessEngin'|cut -d " " -f )
TIME=`date +'%y%m%d %H:%M:%S'`
#输出
echo "${TIME}进程使用内存数=[$RES_NOW]"
echo "${TIME} ${RES_NOW}">>memory.txt
sleep $DREAM
done echo "结束"
输出结果:
同时会打屏输出:
Linux下实现脚本监测特定进程占用内存情况的更多相关文章
- Linux的php-fpm优化心得-php-fpm进程占用内存大和不释放内存问题(转)
原文地址:https://wzfou.com/php-fpm/ 最近发现博客的内存老是隔三差五地被“吃掉”了,登录到后台后偶尔会出卡顿的情况,一开始怀疑是Swap不够导致的,于是给VPS主机增加了几个 ...
- linux下如何获取某一进程占用的物理内存和虚拟内存
首先,ps -A查看你所查看进程的进程号 ps -A 加入进程号为pid 那么使用如下脚本,可以打印该进程使用的虚拟内存和物理内存: root@Storage:/mnt/mtd# cat rss.sh ...
- linux下shell脚本执行jar文件
最近在搞一个shell脚本启动jar文件个关闭jar文件的东东.搞得我都蛋疼了.今天晚上终于弄好了 话说,小弟的linux只是刚入门,经过各方查资料终于搞定了.话不多说,下面开始上小弟写的shell脚 ...
- Linux 下 expect 脚本语言中交互处理常用命令
Linux 下 expect 脚本语言中交互处理常用命令 1. #!/usr/bin/expect 告诉操作系统脚本里的代码使用那一个 shell 来执行.这里的 expect 其实和 Linux 下 ...
- 万答#3,MGR最佳配置参考,PFS里的监测指标要全开吗,mysqld进程占用内存过高怎么排查
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 问题1,有推荐的MGR运行最佳配置参考吗 在「3306π」社区广州站5月22日的分享会上,万里数据库CTO娄帅给出了他建议 ...
- linux下如何批量杀JAVA进程或某个进程方法
linux下如何批量杀JAVA进程或某个进程方法 在工作中经常需要停止JAVA进程,停止时间也比较长,那么有时候因为一些情况,需要把 linux 下JAVA所有进程 kill 掉,又不能用killal ...
- linux如何查看端口被哪个进程占用
1.lsof -i:端口号 2.netstat -tunlp|grep 端口号 都可以查看指定端口被哪个进程占用的情况 工具/原料 linux,windows xshell 方法/步骤 [ ...
- linux如何查看端口被何进程占用
1.lsof -i:端口号 2.netstat -tunlp|grep 端口号 都可以查看指定端口被哪个进程占用的情况 工具/原料 linux,windows xshell 方法/步骤 [ ...
- Linux中查看进程占用内存的情况【转】
转自:http://hutaow.com/blog/2014/08/28/display-process-memory-in-linux/ Linux中查看某个进程占用内存的情况,执行如下命令即可,将 ...
随机推荐
- struct的初始化
1.struct的初始化可以使用类似数组的方式,如下:struct Student{ int _Age; string _Name;};Student stu = {26,"Andy&quo ...
- ESXI 6.5 从载到安装
下载ESXI 访问官网 https://www.vmware.com 到download,选择vsphere 下载esxi https://my.vmware.com/en/group/vmware/ ...
- Android 八款开源 Android 游戏引擎
原文地址 本文内容 Angle Rokon LGame AndEngine libgdx jPCT Alien3d Catcake 最近无意间看到一篇关于 Android 搜索引擎的文章,于是搜索了, ...
- PHP的异常以及异常存在的意义
php的try catch与其它语言的try catch相比有许多不同,而且用起来相对比较不爽. php中,如果你制作的站点相对较大,同时模块化,并且在错误处理机制上有一套自己的处理机制,可以尝试使用 ...
- 获取屏幕的宽和高-Display中getHeight()和getWidth() 官方已废弃
getHeight()和getWidth() deprecated in API level 13 Display dp=getWindowManager().getDefaultDisplay(); ...
- Swift语言精要 - 浅谈结构体(Struct)
CGRect, CGSize, CGPoint这些是 . String, Int, Array, Dictionary这些我们经常用的也是结构体(Struct). 那么结构体(Struct)到底是什么 ...
- 微软BI 之SSAS 系列 - 基于雪花模型的维度设计
基于雪花模型的维度以下面的 Product 产品与产品子类别,产品类别为例. DimProduct 表和 DimProductSubcategory 表有外键关系,而 DimProductSubcat ...
- jquery append()方法与html()方法使用方法差别
append(content):方法在被选元素的结尾(仍然在内部)插入指定内容,有非常多朋友认为append与html差点儿相同.其他从英文意义上append是在原有基础上添加,而html中是替换当前 ...
- 《Unix&Linux大学教程》学习笔记二:指令常识
1:指令的本质——调用可执行程序 在Shell输入命令时,其实就是根据名称运行相应的程序. 2:在系统中查找程序 which 指令名 type 指令名 3:时间与日历 date [-选项] 参数 ca ...
- Java并发容器之非阻塞队列ConcurrentLinkedQueue
参考资料:http://blog.csdn.net/chenchaofuck1/article/details/51660521 实现一个线程安全的队列有两种实现方式:一种是使用阻塞算法,阻塞队列就是 ...