上篇文章我们已经大概了解了 日志截取常用的三个命令:grep sed awk。
具体可参考:
linux实战(一)----日志的截取-----文本过滤器grep、文本流式编辑器sed、报表生成器awk的运用
本文主要记录 这三个命令的运用,一些监控实例的讲解。
对进程是否存在进行监控
思路
在对进程进行监控时,也就是检查进程是否存在。我们一般需要得到该进程的 ID,进程 ID 是进程的唯一标识,但是有时可能在服务器上不同用户下运行着多个相同进程名的进程。如果查询得到则存在,查询不到则不存在。
查询进程一般使用ps命令。
下面的函数 GetPID 给出了获取指定用户下指定进程名的进程 ID 功能(目前只考虑这个用户下启动一个此进程名的进程)。
它有两个参数为用户名和进程名,它首先使用 ps 查找进程信息,同时通过 grep 过滤出需要的进程,最后通过 sed 和 awk 查找需要进程的 ID 值(此函数可根据实际情况修改,比如需要过滤其它信息等)。
实例代码
函数定义
function GetPID #User #Name
{
PsUser=$1
PsName=$2
pid=`ps -u $PsUser|grep $PsName|grep -v grep|grep -v vi|grep -v dbx |grep -v tail|grep -v start|grep -v stop |sed -n 1p |awk '{print $1}'`
echo $pid
}
程序详解
$1 $2表示接受第1个和第2个参数。
ps -u $PsUser 表示 获取该用户拥有的进程。
ps $PsName 获取 含有该进程名的 行。
grep -v:显示不包含匹配文本的所有行。也就是过滤掉 该行
grep -v grep 过滤掉含有grep字符串的行
grep -v vi等同理被过滤。
sed -n 1p (-n)选项和p标志一起使用表示打印选中的行
awk '{print $1}' 只打印选中行的第一列
使用函数
例如查找用户为 zhangZQ,进程名为java 的进程 ID,并输出该进程号
PID=`GetPID zhangZQ java`
echo $PID
结果
在shell中先输入 函数体,则函数体会进入缓存中,这时候我们直接 输入调用语句即可。
如图,我们首先用ps查看zhangZQ都有哪些进程,输入 函数体,输入调用语句,结果输出了名为java的进程号。
所以结果是 10682
对进程使用的CPU进行监控
我们上面已经学习了检测进程是否存在,接着就使用它的进程号PID 来进行查询它耗费的CPU 并且判断是否超出我们的限制。
思路
CPU 过高可能由于业务量过负荷或者出现死循环等异常情况,通过脚本对业务进程 CPU 进行时时监控,可以在 CPU 利用率异常时及时通知维护人员,便于维护人员及时分析,定位,以及避免业务中断等。下面的函数可获得指定进程 ID 的进程 CPU 利用率。它有一个参数为进程 ID,它首先使用 ps 查找进程信息,同时通过 grep -v 过滤掉 %CPU 行,最后通过 awk 查找 CPU 利用百分比的整数部分(如果系统中有多个 CPU,CPU 利用率可以超过 100%)。
实例代码
函数-根据进程号获取CPU利用率
function GetCpu
{
CpuValue=`ps -p $1 -o pcpu |grep -v CPU | awk '{print $1}' | awk -F. '{print $1}'`
echo $CpuValue
}
函数-判断利用率是否超过80%
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
}
程序详解
ps -o 指定只显示什么列和表头。
ps -o pcpu 表示 只显示 使用的CPU时间占可用CPU时间的比例,以百分比表示。也就是利用率。该字段的缺省表头为 %CPU。
ps -p 只显示该pid进程号对应的行。
grep -v CPU 不显示含有CPU字符串的行。
awk '{print $1}' 输出第1列
awk -F . '{print $1}'` 用.作分隔符后 取第1列
if [ $cpu -gt 80 ] 如果cpu变量的值大于80
使用函数
结果
因为这里java进程CPU利用率为0,所以 结果为
The usage of cpu is normal
对进程使用内存进行监控
思路
在对应用服务进行维护时,也经常遇到由于内存使用过大导致进程崩溃,造成业务中断的情况(例如 32 位程序可寻址的最大内存空间为 4G,如果超出将申请内存失败,同时物理内存也是有限的)。内存使用过高可能由于内存泄露,消息堆积等情况,通过脚本对业务进程内存使用量进行时时监控,可以在内存使用量异常时及时发送告警(例如通过短信),便于维护人员及时处理。下面的函数可获得指定进程 ID 的进程内存使用情况。它有一个参数为进程 ID,它首先使用 ps 查找进程信息,同时通过 grep -v 过滤掉 VSZ 行 , 然后通过除 1000 取以兆为单位的内存使用量。
实例代码
函数-根据进程号获取内存使用量
function GetMem
{
MEMUsage=`ps -o vsz -p $1|grep -v VSZ`
(( MEMUsage /= 1000))
echo $MEMUsage
}
函数-判断使用量是否超过1.6G
function CheckMem
{
mem=`GetMem $PID`
if [ $mem -gt 1638 ]
then
{
echo “The usage of memory is larger than 1.6G”
}
else
{
echo “The usage of memory is normal”
}
fi
}
程序详解
ps -o vsz 只显示内存列
ps -p 根据进程号显示行
grep -v VSZ 去掉含有VSZ字符串的行
$mem -gt 1638 判断大于 1.6G =1.6*1024MB 约等于 1638
使用函数
结果
The usage of memory is larger than 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
}
函数-判断句柄量是否超过900
function CheckDes
{
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
}
程序详解
ls是列出目录中的所有文件
proc 是文件系统命令 在proc文件系统中,主要包含三大类内容,进程相关部分,系统信息部分,以及系统子系统部分。
fd 包含所有进程打开的文件描述符的子目录
ls /proc/$1/fd 根据进程号获取该进程打开的所有子目录--也就是句柄数
wc -l 只输出文件行数,也就是计数
使用函数
结果
监控某个 TCP 或 UDP 端口是否在监听
思路
端口检测是系统资源检测经常遇到的,特别是在网络通讯情况下,端口状态的检测往往是很重要的。有时可能进程,CPU,内存等处于正常状态,但是端口处于异常状态,业务也是没有正常运行。下面函数可判断指定端口是否在监听。它有一个参数为待检测端口,它首先使用 netstat 输出端口占用信息,然后通过 grep, awk,wc 过滤输出监听 TCP 端口的个数,第二条语句为输出 UDP 端口的监听个数,如果 TCP 与 UDP 端口监听都为 0,返回 0,否则返回 1.
实例代码
函数-检测端口数量
function Listening
{
TCPListeningnum=`netstat -an | grep ":$1 " |awk '$1 == "tcp" && $NF == "LISTEN" {print $0}' | wc -l`
UDPListeningnum=`netstat -an|grep ":$1 " |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
}
函数-判断是否在监听
function checkListen
{
isListen=`Listening $1`
if [ $isListen -eq 1 ]
then
{
echo "The port is listening"
}
else
{
echo "The port is not listening"
}
fi
}
程序详解
netstat -an 是查询网络端口状态的
grep ":$1 " 查询出 传入的端口号 所在的行 注意 这里的$1表示接收函数传入的第一个参数 跟下面awk 中的$1是不同的含义。
awk '$1 == "tcp" && $NF == "LISTEN" {print $0}' 的意思是 当第一列 等于 tcp 并且最后一列等于 LISTEN时 输出整行。
在awk中 $1代表第一列 , NF是总列数,$NF则代表最后一列.。$0代表 输出所有列。
同理理解第二句awk。
isListen=`Listening $1` 这里$1接收端口号 传入Listening函数中
使用函数
结果
查看某个进程名正在运行的个数
思路
有时我们可能需要得到服务器上某个进程的启动个数,我们只要用ps查询出 进程名为该进程的行 用wc -l计数即可。例如进程名为 CFTestApp。
实例代码
函数-通过进程名获取进程个数
function CheckCount
{
Runnum=`ps -ef| grep -v vi | grep -v tail|grep -v grep | grep "[/]$1 " | wc -l`
echo $Runnum
}
程序详解
ps -ef 以全格式查看进程
grep -v 不显示含有vi等字符串的行
grep [] 是正则的运用 表示单个字符符合。
grep [/] 表示查找含有/的字符串
grep [/] $1 表示查找含有/的字符串且连接 我们传入的进程参数名的行
使用函数
结果
因为当前没有CFTestApp的进程所以为0
监控系统CPU负载
思路
在对服务器进行维护时,有时也遇到由于系统 CPU(利用率)负载 过量导致业务中断的情况。服务器上可能运行多个进程,查看单个进程的 CPU 都是正常的,但是整个系统的 CPU 负载可能是异常的。通过脚本对系统 CPU 负载进行时时监控,可以在异常时及时发送告警,便于维护人员及时处理,预防事故发生。下面的函数可以检测系统 CPU 使用情况 . 使用 vmstat 取 5 次系统 CPU 的 idle 值,取平均值,然后通过与 100 取差得到当前 CPU 的实际占用值。
实例代码
函数-获取系统的CPU的占用值
function GetSysCPU
{
CpuIdle=`vmstat 1 5 |sed -n '3,$p'|awk '{x = x + $15} END {print x/5}' |awk -F. '{print $1}'`
CpuNum=`echo "100-$CpuIdle" | bc`
echo $CpuNum
}
函数-判断系统CPU是否超过90
function CheckSysCPU
{
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
}
程序详解
vmstat 用来显示虚拟内存的信息
命令参数:
-a:显示活跃和非活跃内存
-f:显示从系统启动至今的fork数量 。
-m:显示slabinfo
-n:只在开始时显示一次各字段名称。
-s:显示内存相关统计信息及多种系统活动数量。
delay:刷新时间间隔。如果不指定,只显示一条结果。
count:刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。
-d:显示磁盘相关统计信息。
-p:显示指定磁盘分区统计信息
-S:使用指定单位显示。参数有 k 、K 、m 、M ,分别代表1000、1024、1000000、1048576字节(byte)。默认单位为K(1024 bytes)
-V:显示vmstat版本信息。
说明:
字段说明:
Procs(进程):
r: 运行队列中进程数量
b: 等待IO的进程数量
Memory(内存):
swpd: 使用虚拟内存大小
free: 可用内存大小
buff: 用作缓冲的内存大小
cache: 用作缓存的内存大小
Swap:
si: 每秒从交换区写到内存的大小
so: 每秒写入交换区的内存大小
IO:(现在的Linux版本块的大小为1024bytes)
bi: 每秒读取的块数
bo: 每秒写入的块数
系统:
in: 每秒中断数,包括时钟中断。
cs: 每秒上下文切换数。
CPU(以百分比表示):
us: 用户进程执行时间(user time)
sy: 系统进程执行时间(system time)
id: 空闲时间(包括IO等待时间),中央处理器的空闲时间 。以百分比表示。
wa: 等待IO时间
vmstat 1 5
表示每1秒刷新一次,取5次
sed -n '3,$p '
-n表示只打印选中的行,地址是一个数字,则表示行号;是“$"符号,则表示最后一行。 '3,$'表示 第3行到最后一行,p是命令表示打印输出。
awk '{x = x + $15} END {print x/5}'
表示将每行的 第15列相加后 除以5求平均
awk -F. '{print $1}'
用.来分隔取第1列 也就是对平均数 取整的意思
使用函数
结果
我这里CPU的使用率为1%
监控目录占用的系统磁盘空间
思路
系统磁盘空间检测是系统资源检测的重要部分,在系统维护维护中,我们经常需要查看服务器磁盘空间使用情况。因为有些业务要时时写话单,日志,或者临时文件等,如果磁盘空间用尽,也可能会导致业务中断,下面的函数可以检测当前系统磁盘空间中某个目录的磁盘空间使用情况 . 输入参数为需要检测的目录名,使用 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
}
函数-判断占用空间是否超过90%
function CheckDiskSpc
{
DiskSpace=`GetDiskSpc $1`
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
}
程序详解
$# 这个函数的参数个数 函数中判断如果参数个数不为1则返回1
df -k 查看硬盘的使用情况 -k 表示以k字节为单位
"$1$" 表示接受第一个参数也就是目录 并且与$号组成字符串 这里$表示正则中的结束符
grep "$1$"则表示 以该目录为结尾的 行
awk '{print $5}' 取第5列
awk -F% '{print $1}'` 用%号分割后取第1列
使用函数
结果
到这里我们就熟悉了 监控查看的大概思路 ,其它 top free等的查询监控 照着上面的方式来写就行。