Linux下实现脚本监测特定进程占用内存情况

时间:2022-01-02 14:03:17

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将多行变成了单行,见下图)。

Linux下实现脚本监测特定进程占用内存情况

第14行:通过top查看内存使用情况,并通过grep过滤后输出到文件

Linux下实现脚本监测特定进程占用内存情况

运行脚本:./meminfo.sh [args1]
最后输出结果:cat /home/info/info-20170629

Linux下实现脚本监测特定进程占用内存情况

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下实现脚本监测特定进程占用内存情况

Linux下实现脚本监测特定进程占用内存情况的更多相关文章

  1. Linux的php-fpm优化心得-php-fpm进程占用内存大和不释放内存问题(转)

    原文地址:https://wzfou.com/php-fpm/ 最近发现博客的内存老是隔三差五地被“吃掉”了,登录到后台后偶尔会出卡顿的情况,一开始怀疑是Swap不够导致的,于是给VPS主机增加了几个 ...

  2. linux下如何获取某一进程占用的物理内存和虚拟内存

    首先,ps -A查看你所查看进程的进程号 ps -A 加入进程号为pid 那么使用如下脚本,可以打印该进程使用的虚拟内存和物理内存: root@Storage:/mnt/mtd# cat rss.sh ...

  3. linux下shell脚本执行jar文件

    最近在搞一个shell脚本启动jar文件个关闭jar文件的东东.搞得我都蛋疼了.今天晚上终于弄好了 话说,小弟的linux只是刚入门,经过各方查资料终于搞定了.话不多说,下面开始上小弟写的shell脚 ...

  4. Linux 下 expect 脚本语言中交互处理常用命令

    Linux 下 expect 脚本语言中交互处理常用命令 1. #!/usr/bin/expect 告诉操作系统脚本里的代码使用那一个 shell 来执行.这里的 expect 其实和 Linux 下 ...

  5. linux下如何批量杀JAVA进程或某个进程方法

    linux下如何批量杀JAVA进程或某个进程方法 在工作中经常需要停止JAVA进程,停止时间也比较长,那么有时候因为一些情况,需要把 linux 下JAVA所有进程 kill 掉,又不能用killal ...

  6. linux如何查看端口被哪个进程占用

    1.lsof -i:端口号 2.netstat -tunlp|grep 端口号 都可以查看指定端口被哪个进程占用的情况 工具/原料   linux,windows xshell 方法/步骤     [ ...

  7. linux如何查看端口被何进程占用

    1.lsof -i:端口号 2.netstat -tunlp|grep 端口号 都可以查看指定端口被哪个进程占用的情况 工具/原料   linux,windows xshell 方法/步骤     [ ...

  8. Linux中查看进程占用内存的情况【转】

    转自:http://hutaow.com/blog/2014/08/28/display-process-memory-in-linux/ Linux中查看某个进程占用内存的情况,执行如下命令即可,将 ...

  9. linux如何查看端口被哪个进程占用的方法

    linux如何查看端口被哪个进程占用的方法: 1.lsof -i:端口号2.netstat -tunlp|grep 端口号 都可以查看指定端口被哪个进程占用的情况[步骤一]lsof -ilsof -i ...

随机推荐

  1. [LeetCode] Longest Substring with At Most Two Distinct Characters 最多有两个不同字符的最长子串

    Given a string S, find the length of the longest substring T that contains at most two distinct char ...

  2. CSS技巧和经验:

    1. 如何清除图片下方出现几像素的空白间隙 方法1 img { display: block; } 方法2 img { vertical-align: top; } // 除了top值,还可以设置为t ...

  3. 冰球项目日志4-yjw

    小组讨论 我们组编程主要分成三个模块,各自负责自己的编程与测试. 杨静梧:确定击球算法编程.输入:冰球位置,速度大小方向:输出:撞击时冰球中心位置. 曹迦勒:确定击球手速度,位置.输入:撞击时冰球中心 ...

  4. 解决MySql无法远程连接

    安装完MySql后远程通过Navicat访问时报错: ERROR 1130: Host ***.***.***.*** is not allowed to connect to this MySQL ...

  5. DataGridView key points

    Simple Examples => http://csharp.net-informations.com/datagridview/csharp-datagridview-readonly-c ...

  6. Longest Common Subsequence & Substring & prefix

    Given two strings, find the longest common subsequence (LCS). Your code should return the length of  ...

  7. CSS 负边距自适应布局

    单列定宽单列自适应布局: <!DOCTYPE HTML> <html> <head>     <meta charset="UTF-8"& ...

  8. 个人整理--Java编码规范

    编码规范对于开发人员来说是非常重要的,有以下几个原因: 1.一个软件的生命周期中,80%的花费在于维护 2.几乎没有任何一个软件,在其整个生命周期中,均由最初的开发人员来维护 3.编码规范可以改善软件 ...

  9. L9-2&period;安装mysql数据库

    二.安装mysql 1.检查是否安装了mysql 2.安装cmake 输入gmake: make install 安装依赖的软件包: 新建用户权限等: 解压 安装 安装: 安装成功. 安装后调整: v ...

  10. OpenCV 闭合轮廓检测

    这个好像是骨头什么的,但是要求轮廓闭合,于是对图片进行一下膨胀操作,再次检测轮廓就好了. // A closed contour.cpp : 定义控制台应用程序的入口点. // #include &q ...