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 10

#删除上次的监控文件
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 5
    PID=$(ps | grep $PROCESS | grep -v ‘grep‘ | awk ‘{print $1;}‘)
done

范例2

shell脚本

#!/bin/bash
pid=$1  #获取进程pid
echo $pid
interval=1  #设置采集间隔
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 1 -p $pid|tail -2|head -1|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

  

  

原文地址:https://www.cnblogs.com/saryli/p/9924544.html

时间: 2024-11-09 02:20:57

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

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

首先,ps -A查看你所查看进程的进程号 ps -A 加入进程号为pid 那么使用如下脚本,可以打印该进程使用的虚拟内存和物理内存: [email protected]:/mnt/mtd# cat rss.sh #!/bin/sh while true do  cat /proc/pid/stat | awk -F" " '{print "virt:"$23}' cat /proc/pid/stat | awk -F" " '{print &qu

linux下shell脚本执行方法及exec和source命令

exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息. bash shell的命令分为两类:外部命令和内部命令.外部命令是通过系统调用或独立的程序实现的,如sed.awk等等.内部命令是由特殊的文件格式(.def)所实现,如cd.history.exec等等. 在说明exe和source的区别之前,先说明一下fork的概念. fork是linux的系统调用,用来创建子进程(child

linux下shell脚本执行jar文件

最近在搞一个shell脚本启动jar文件个关闭jar文件的东东.搞得我都蛋疼了.今天晚上终于弄好了 话说,小弟的linux只是刚入门,经过各方查资料终于搞定了.话不多说,下面开始上小弟写的shell脚本 上面是小弟写的shell脚本.写的不好请见谅. 首先遇到的第一个坑 我在window下写的 然后道linux中执行,在linux死活都说俺的19行有错误,俺就不明白了,哪里有错,问了下别人,也说没错.突然有个高人问我在哪编写的,小弟回答在win下,他告诉俺执行下这个命令: dos2unix se

Linux中查看进程占用内存和系统资源情况的命令

用 'top -i' 看看有多少进程处于 Running 状态,可能系统存在内存或 I/O 瓶颈,用 free 看看系统内存使用情况,swap 是否被占用很多,用 iostat 看看 I/O 负载情况... 还有一种办法是 ps -ef | sort -k7 ,将进程按运行时间排序,看哪个进程消耗的cpu时间最多. top: 主要参数 d:指定更新的间隔,以秒计算. q:没有任何延迟的更新.如果使用者有超级用户,则top命令将会以最高的优先序执行. c:显示进程完整的路径与名称. S:累积模式,

Linux下查看端口被哪个程序占用

Linux如何查看端口被哪个进程占用的方法,使用工具lsof,netstat: 1.lsof -i: 端口号 lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP.UDP).找回/恢复删除的文件.是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行. 如果系统没有lsof工具,可以通过yum安装之. yum install lsof 选项: -a:列出打开文件存在的进程:  -c<进程名>:列出指定进程所打开的文件:  -g:列

Linux下Tomcat端口号以及进程

 Linux下Tomcat端口号以及进程 1,查看tomcat进程: ps -aux | grep tomcat(或者ps -ef | grep tomcat都行) 可以看到现在运行着两个tomcat进程,一个进程的pid为9974,另一个pid为23422.  2,根据进程查看端口号: sudo netstat -naop | grep 23422 这是查看pid为23422的进程占用的端口号: 可以看到9300和9399端口号被占用,其中9399是tomact Server的SHUTDOWN

Linux下shell脚本监控Tomcat的状态并实现自动启动

最近公司需要在Linux下监控tomcat的服务,一旦tomcat服务存在异常或者宕机,重启tomcat保证服务的正常运行,由于Linux下有Shell脚本可以实现此效果,下面是Linux下shell脚本监控Tomcat的状态并实现自动启动的步骤. 1.编写Shell脚本monitor.sh #!/bin/sh # func:自动监控tomcat脚本并且执行重启操作# author:EagleHao# date:2018-04-08# DEFINE # 获取tomcat进程ID(其中[grep

Linux下Shell脚本输出带颜色文字

Linux下Shell脚本输出带颜色文字 文本终端的颜色可以使用"ANSI非常规字符序列"来生成. 举例:    "echo -e \033[44;37;5m BLUE \033[0m" "echo -e \033[44;37;5m BLUE \033[0m BLACK" 需要修改的地方是红色带下划线的部分,其中[***m部分的内容换成下面的数字,后面的内容是自己想要上色的内容. 以上命令设置作用如下:背景色为蓝色,前景色为白色,字体闪烁,输出字

linux下tomcat shutdown后 java进程依旧存在

今天遇到一个很奇怪的问题,如标题所示: linux下(之所以强调linux下,是因为在windows下正常),执行tomcat ./shutdown.sh 后,虽然tomcat服务不能正常访问了,但是ps -ef | grep java 后,发现tomcat对应的java进程未随web容器关闭而销毁,进而存在僵尸java进程. 刚开始百思不得其解,google下,发现存在一种说法是:有非守护线程存在,jvm不会退出.进而确认是因为项目代码存在 scheduledExecutorService.s