[转]使用 Shell 对进程资源进行监控
原文:http://www.ibm.com/developerworks/cn/linux/l-cn-shell-monitoring/
使用 Shell 对进程资源进行监控
检查进程是否存在
在 对进程进行监控时,我们一般需要得到该进程的 ID,进程 ID 是进程的唯一标识,但是有时可能在服务器上不同用户下运行着多个相同进程名的进程,下面的函数 GetPID 给出了获取指定用户下指定进程名的进程 ID 功能(目前只考虑这个用户下启动一个此进程名的进程),它有两个参数为用户名和进程名,它首先使用 ps 查找进程信息,同时通过 grep 过滤出需要的进程,最后通过 sed 和 awk 查找需要进程的 ID 值(此函数可根据实际情况修改,比如需要过滤其它信息等)。
清单 1. 对进程进行监控
function GetPID #User #Name
{
PsUser=$1
PsName=$2
pid=`ps -u $PsUser|grep $PsName|grep -v grep|grep -v vi|grep -v dbx\n
|grep -v tail|grep -v start|grep -v stop |sed -n 1p |awk '{print $1}'`
echo $pid
}
示例演示:
1)源程序(例如查找用户为 root,进程名为 CFTestApp 的进程 ID)
PID=`GetPID root CFTestApp` echo $PID
2)结果输出
11426
[dyu@xilinuxbldsrv shell]$
3)结果分析
从上面的输出可见:11426 为 root 用户下的 CFTestApp 程序的进程 ID。
4)命令介绍
有时有可能进程没有启动,下面的功能是检查进程 ID 是否存在,如果此进程没有运行输出:
The process does not exist.
# 检查进程是否存在
if [ "-$PID" == "-" ]
then
{
echo "The process does not exist."
}
fi
检测进程 CPU 利用率
在对应用服务进行维护时,我们经常 遇到由于 CPU 过高导致业务阻塞,造成业务中断的情况。CPU 过高可能由于业务量过负荷或者出现死循环等异常情况,通过脚本对业务进程 CPU 进行时时监控,可以在 CPU 利用率异常时及时通知维护人员,便于维护人员及时分析,定位,以及避免业务中断等。下面的函数可获得指定进程 ID 的进程 CPU 利用率。它有一个参数为进程 ID,它首先使用 ps 查找进程信息,同时通过 grep -v 过滤掉 %CPU 行,最后通过 awk 查找 CPU 利用百分比的整数部分(如果系统中有多个 CPU,CPU 利用率可以超过 100%)。
清单 2. 对业务进程 CPU 进行实时监控
function GetCpu
{
CpuValue=`ps -p $1 -o pcpu |grep -v CPU | awk '{print $1}' | awk - F. '{print $1}'`
echo $CpuValue
}
下面的功能是通过上面的函数 GetCpu 获得此进程的 CPU 利用率,然后通过条件语句判断 CPU 利用率是否超过限制,如果超过 80%(可以根据实际情况进行调整),则输出告警,否则输出正常信息。
清单 3. 判断 CPU 利用率是否超过限制
function CheckCpu
{
PID=$1
cpu=`GetCpu $PID`
if [ $cpu -gt 80 ]
then
{
echo “The usage of cpu is larger than 80%”
}
else
{
echo “The usage of cpu is normal”
}
fi
}
示例演示:
1)源程序(假设上面已经查询出 CFTestApp 的进程 ID 为 11426)
CheckCpu 11426
2)结果输出
The usage of cpu is 75
The usage of cpu is normal
[dyu@xilinuxbldsrv shell]$
3)结果分析
从上面的输出可见:CFTestApp 程序当前的 CPU 使用为 75%,是正常的,没有超过 80% 的告警限制。
检测进程内存使用量
在 对应用服务进行维护时,也经常遇到由于内存使用过大导致进程崩溃,造成业务中断的情况(例如 32 位程序可寻址的最大内存空间为 4G,如果超出将申请内存失败,同时物理内存也是有限的)。内存使用过高可能由于内存泄露,消息堆积等情况,通过脚本对业务进程内存使用量进行时时监控, 可以在内存使用量异常时及时发送告警(例如通过短信),便于维护人员及时处理。下面的函数可获得指定进程 ID 的进程内存使用情况。它有一个参数为进程 ID,它首先使用 ps 查找进程信息,同时通过 grep -v 过滤掉 VSZ 行 , 然后通过除 1000 取以兆为单位的内存使用量。
清单 4. 对业务进程内存使用量进行监控
function GetMem
{
MEMUsage=`ps -o vsz -p $1|grep -v VSZ`
(( MEMUsage /= 1000))
echo $MEMUsage
}
下面的功能是通过上面的函数 GetMem
获得此进程的内存使用,然后通过条件语句判断内存使用是否超过限制,如果超过 1.6G(可以根据实际情况进行调整),则输出告警,否则输出正常信息。
清单 5. 判断内存使用是否超过限制
mem=`GetMem $PID`
if [ $mem -gt 1600 ]
then
{
echo “The usage of memory is larger than 1.6G”
}
else
{
echo “The usage of memory is normal”
}
fi
示例演示:
1)源程序(假设上面已经查询出 CFTestApp 的进程 ID 为 11426)
mem=`GetMem 11426` echo "The usage of memory is $mem M" if [ $mem -gt 1600 ]
then
{
echo "The usage of memory is larger than 1.6G"
}
else
{
echo "The usage of memory is normal"
}
fi
2)结果输出
The usage of memory is 248 M
The usage of memory is normal
[dyu@xilinuxbldsrv shell]$
3)结果分析
从上面的输出可见:CFTestApp 程序当前的内存使用为 248M,是正常的,没有超过 1.6G 的告警限制。
检测进程句柄使用量
在 对应用服务进行维护时,也经常遇到由于句柄使用 过量导致业务中断的情况。每个平台对进程的句柄使用都是有限的,例如在 Linux 平台,我们可以使用 ulimit – n 命令(open files (-n) 1024)或者对 /etc/security/limits.conf 的内容进行查看,得到进程句柄限制。句柄使用过高可能由于负载过高,句柄泄露等情况,通过脚本对业务进程句柄使用量进行时时监控,可以在异常时及时发送告 警(例如通过短信),便于维护人员及时处理。下面的函数可获得指定进程 ID 的进程句柄使用情况。它有一个参数为进程 ID,它首先使用 ls 输出进程句柄信息,然后通过 wc -l 统计输出句柄个数。
function GetDes
{
DES=`ls /proc/$1/fd | wc -l`
echo $DES
}
下面功能是通过上面的函数 GetDes
获得此进程的句柄使用量,然后通过条件语句判断句柄使用是否超过限制,如果超过 900(可以根据实际情况进行调整)个,则输出告警,否则输出正常信息。
des=` GetDes $PID`
if [ $des -gt 900 ]
then
{
echo “The number of des is larger than 900”
}
else
{
echo “The number of des is normal”
}
fi
示例演示:
1)源程序(假设上面查询出 CFTestApp 的进程 ID 为 11426)
des=`GetDes 11426` echo "The number of des is $des" if [ $des -gt 900 ]
then
{
echo "The number of des is larger than 900"
}
else
{
echo "The number of des is normal"
}
fi
2)结果输出
The number of des is 528
The number of des is normal
[dyu@xilinuxbldsrv shell]$
3)结果分析
从上面的输出可见:CFTestApp 程序当前的句柄使用为 528 个,是正常的,没有超过 900 个的告警限制。
4)命令介绍
使用 Shell 对系统资源进行监控
查看某个 TCP 或 UDP 端口是否在监听
端 口检测是系统资源检测经常遇到的,特别是在网络通讯情况下,端口状态的检测往往是很重要的。有时可能进程,CPU,内存等处于正常状态,但是端口处于异常 状态,业务也是没有正常运行。下面函数可判断指定端口是否在监听。它有一个参数为待检测端口,它首先使用 netstat 输出端口占用信息,然后通过 grep, awk,wc 过滤输出监听 TCP 端口的个数,第二条语句为输出 UDP 端口的监听个数,如果 TCP 与 UDP 端口监听都为 0,返回 0,否则返回 1.
清单 6. 端口检测
function Listening
{
TCPListeningnum=`netstat -an | grep ":$1 " | \n
awk '$1 == "tcp" && $NF == "LISTEN" {print $0}' | wc -l`
UDPListeningnum=`netstat -an|grep ":$1 " \n
|awk '$1 == "udp" && $NF == "0.0.0.0:*" {print $0}' | wc -l`
(( Listeningnum = TCPListeningnum + UDPListeningnum ))
if [ $Listeningnum == 0 ]
then
{
echo "0"
}
else
{
echo "1"
}
fi
}
示例演示:
1)源程序(例如查询 8080 端口的状态是否在监听)
isListen=`Listening 8080`
if [ $isListen -eq 1 ]
then
{
echo "The port is listening"
}
else
{
echo "The port is not listening"
}
fi
2)结果输出
The port is listening
[dyu@xilinuxbldsrv shell]$
3)结果分析
从上面的输出可见:这个 Linux 服务器的 8080 端口处在监听状态。
4)命令介绍
下面的功能也是检测某个 TCP 或者 UDP 端口是否处在正常状态。
tcp: netstat -an|egrep $1 |awk '$6 == "LISTEN" && $1 == "tcp" {print $0}'
udp: netstat -an|egrep $1 |awk '$1 == "udp" && $5 == "0.0.0.0:*" {print $0}'
命令介绍
查看某个进程名正在运行的个数
有时我们可能需要得到服务器上某个进程的启动个数,下面的功能是检测某个进程正在运行的个数,例如进程名为 CFTestApp。
Runnum=`ps -ef | grep -v vi | grep -v tail | grep "[ /]CFTestApp" | grep -v grep | wc -l
检测系统 CPU 负载
在 对服务器进行维护时,有时也遇到由于系统 CPU(利用率)负载 过量导致业务中断的情况。服务器上可能运行多个进程,查看单个进程的 CPU 都是正常的,但是整个系统的 CPU 负载可能是异常的。通过脚本对系统 CPU 负载进行时时监控,可以在异常时及时发送告警,便于维护人员及时处理,预防事故发生。下面的函数可以检测系统 CPU 使用情况 . 使用 vmstat 取 5 次系统 CPU 的 idle 值,取平均值,然后通过与 100 取差得到当前 CPU 的实际占用值。
function GetSysCPU
{
CpuIdle=`vmstat 1 5 |sed -n '3,$p' \n
|awk '{x = x + $15} END {print x/5}' |awk -F. '{print $1}'
CpuNum=`echo "100-$CpuIdle" | bc`
echo $CpuNum
}
示例演示:
1)源程序
cpu=`GetSysCPU` echo "The system CPU is $cpu" if [ $cpu -gt 90 ]
then
{
echo "The usage of system cpu is larger than 90%"
}
else
{
echo "The usage of system cpu is normal"
}
fi
2)结果输出
The system CPU is 87
The usage of system cpu is normal
[dyu@xilinuxbldsrv shell]$
3)结果分析
从上面的输出可见:当前 Linux 服务器系统 CPU 利用率为 87%,是正常的,没有超过 90% 的告警限制。
4)命令介绍
参数: -n 表示在周期性循环输出时,输出的头部信息仅显示一次。
检测系统磁盘空间
系统磁盘空间检测是系统资源检测的重要部分,在系统维护维护中,我们
经常需要查看服务器磁盘空间使用情况。因为有些业务要时时写话单,日志,或者临时文件等,如果磁盘空间用尽,也可能会导致业务中断,下面的函数可以检测当
前系统磁盘空间中某个目录的磁盘空间使用情况 . 输入参数为需要检测的目录名,使用 df 输出系统磁盘空间使用信息,然后通过 grep 和 awk
过滤得到某个目录的磁盘空间使用百分比。
function GetDiskSpc
{
if [ $# -ne 1 ]
then
return 1
fi Folder="$1$"
DiskSpace=`df -k |grep $Folder |awk '{print $5}' |awk -F% '{print $1}'
echo $DiskSpace
}
示例演示:
1)源程序(检测目录为 /boot)
Folder="/boot" DiskSpace=`GetDiskSpc $Folder` echo "The system $Folder disk space is $DiskSpace%" if [ $DiskSpace -gt 90 ]
then
{
echo "The usage of system disk($Folder) is larger than 90%"
}
else
{
echo "The usage of system disk($Folder) is normal"
}
fi
2)结果输出
The system /boot disk space is 14%
The usage of system disk(/boot) is normal
[dyu@xilinuxbldsrv shell]$
3)结果分析
从上面的输出可见:当前此 Linux 服务器系统上 /boot 目录的磁盘空间已经使用了 14%,是正常的,没有超过使用 90% 的告警限制。
4)命令介绍
[转]使用 Shell 对进程资源进行监控的更多相关文章
- 使用 shell 脚本对 Linux 系统和进程资源进行监控
Shell 简介 Shell 语言对于接触 LINUX 的人来说都比较熟悉,它是系统的用户界面,提供了用户与内核进行交互操作的一种接口.它接收用户输入的命令并把它送入内核去执行.实际上 Shell 是 ...
- 使用Shell脚本对Linux系统和进程资源进行监控
ShellLinux脚本 摘要:Shell语言对于接触Linux的人来说都比较熟悉,它是系统的用户界面,提供了用户与内核进行交互操作的一种接口.本文我们以Bash做为实例总结了使用Shell对系统和进 ...
- Linux 进程资源用量监控和按用户设置进程限制
每个 Linux 系统管理员都应该知道如何验证硬件.资源和主要进程的完整性和可用性.另外,基于每个用户设置资源限制也是其中一项必备技能. 在这篇文章中,我们会介绍一些能够确保系统硬件和软件正常工作的方 ...
- Keepalived详解(四):通过vrrp_script实现对集群资源的监控【转】
一.通过vrrp_script实现对集群资源的监控: Keepalived基础HA功能时用到了vrrp_script这个模块,此模块专门用于对集群中服务资源进行监控.与此模块一起使用的还有track_ ...
- Linux进程资源占用分析
[时间:2018-03] [状态:Open] [关键词:linux, 进程,proc,top] 0 引言 最近在分析安卓程序上的monkey测试日志时发现,需要了解下Linux进程资源占用情况及其查看 ...
- Windows应用程序进程级别统一监控实践
一般的系统级别指标监控,更多关注CPU.内存.磁盘.网络等运行情况,对应用程序运行时的进程指标关注不够,导致不能深入了解系统运行状态.本文根据笔者应用实践,探讨一下进程级别监控涉及到的监控内容以及监控 ...
- 资源限制 ( resource limit 或 rlimit ),是 Linux 内核控制 用户 或 进程 资源占用的机制。
###### https://learn-linux.readthedocs.io/zh_CN/latest/administration/kernel/rlimit.html ########### ...
- shell浅谈之九子shell与进程处理
转自:http://blog.csdn.net/taiyang1987912/article/details/39529291 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] ...
- Bash Shell 获取进程 PID
转载地址:http://weyo.me/pages/techs/linux-get-pid/ 导读 Linux 的交互式 Shell 与 Shell 脚本存在一定的差异,主要是由于后者存在一个独立的运 ...
随机推荐
- android中如何在低版本(5.0之前)上使用tint(着色)属性
1. 使用app前缀(app:backgroundTint,app:backgroundTintMode),如果使用android前缀,在低版本上是拿不到值的,因为这些属性是5.0以后才加入的. 2. ...
- orange pi pc 体验(一)
最近在淘宝上看到一款和树莓派差不多的卡片机,定价才99元,而且是国产的,忍不住入手了一个,就是orange pi 感兴趣的可以百度搜索下,深圳一个公司出的,不过资料比树莓派少了很多,论坛中人也没多少, ...
- Swift:闭包
一.闭包的介绍 闭包表达式(Closure Expressions) 尾随闭包(Trailing Closures) 值捕获(Capturing Values) 闭包是引用类型(Closures Ar ...
- 第四篇:白话tornado源码之褪去模板外衣的前戏
加班程序员最辛苦,来张图醒醒脑吧! ... ... ... 好了,醒醒吧,回归现实看代码了!! 执行字符串表示的函数,并为该函数提供全局变量 本篇的内容从题目中就可以看出来,就是为之后剖析tornad ...
- [SharePoint 2013] Set value for people editor with JSOM
function PeoplePicker() { this.context = null; this.web = null; this.currentUser = null; this.parent ...
- C++ 中的sort排序用法
STL中就自带了排序函数sortsort 对给定区间所有元素进行排序 要使用此函数只需用#include <algorithm> sort即可使用,语法描述为:sort(begin,end ...
- haproxy para config
.. from http://www.cnblogs.com/dkblog/archive/2012/03/13/2393321.html 常用配置选项: OPTION 选项: option http ...
- The prefix "util" for element "util:list" is not bound.
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4. ...
- 天啦噜!原来Chrome自带的开发者工具能这么用你知道么!
Chrome自带开发者工具.它的功能十分丰富,包括元素.网络.安全等等.今天我们主要介绍JavaScript控制台部分的功能. 我最早写代码的时候,也就是在JS控制台里输出一些服务器返回的内容,或者一 ...
- 关于Java内存模型的解读
运行时数据区域 运行时数据区包括以下五大部分:方法区.堆.虚拟机栈.本地方法栈.程序计数器.其中,方法区和堆是由所有线程共享的数据区,其他区域是线程隔离的数据区. 程序计数器: 程序计数器是一块较小的 ...