使用shell脚本对Linux系统和进程资源进行监控
原文地址:http://www.ibm.com/developerworks/cn/linux/l-cn-shell-monitoring/
检查进程是否存在
在 对进程进行监控时,我们一般需要得到该进程的 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)命令介绍