8个⾮常实⽤的Linux系统监控shell脚本
在服务器运维过程中,经常需要对服务器的各种资源进⾏监控,例如:CPU的负载监控,磁盘的使⽤率监控,进程数⽬监控等等,以在系统出现异常时及时报警,通知系统管理员。本⽂介绍在Linux系统下⼏种常见的监控需求及其shell脚本的编写。
⽂章⽬录:
1.Linux使⽤ Shell 检查进程是否存在
2.Linux使⽤ Shell检测进程 CPU 利⽤率
3.Linux使⽤ Shell检测进程内存使⽤量
4.Linux使⽤ Shell检测进程句柄使⽤量
5.Linux使⽤ Shell查看某个 TCP 或 UDP 端⼝是否在监听
6.Linux使⽤ Shell查看某个进程名正在运⾏的个数
7.Linux使⽤ Shell检测系统 CPU 负载
8.Linux使⽤ Shell检测系统磁盘空间
9.总结
检查进程是否存在
在对进程进⾏监控时,我们⼀般需要得到该进程的 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)命令介绍
1. ps: 查看系统中瞬间进程信息。参数:-u< ⽤户识别码 > 列出属于该⽤户的程序的状况,也可使⽤⽤户名称来指定。 -p< 进程识别码 >指定进程识别码,并列出该进程的状况。 -o 指定输出格式
2. grep: ⽤于查⽂件中符合字符串的当前⾏。参数:-v 反向选择,亦即显⽰出没有 ‘搜寻字符串’ 内容的那⼀⾏。
3. sed: ⼀个⾮交互性⽂本编辑器,它编辑⽂件或标准输⼊导出的⽂件,⼀次只能处理⼀⾏内容。参数:-
n 读取下⼀个输⼊⾏,⽤下⼀个命令处理新的⾏⽽不是⽤第⼀个命令。 p 标志打印匹配⾏ 4. awk:⼀种编程语⾔,⽤于在 linux/unix 下对⽂本和数据进⾏处理。数据可以来⾃标准输⼊、⼀个或多个⽂件,或其它命令的输出。它⽀持⽤户⾃定义函数和动态正则表达式等先进功能,是 linux/unix 下的⼀个强⼤编程⼯具。它在命令⾏中使⽤,但更多是作为脚本来使⽤。awk 的处理⽂本和数据的⽅式:它逐⾏扫描⽂件,从第⼀⾏到最后⼀⾏,寻匹配的特定模式的⾏,并在这些⾏上进⾏你想要的操作。
如果没有指定处理动作,则把匹配的⾏显⽰到标准输出 (屏幕 ),如果没有指定模式,则所有被操作所指定的⾏都被处理。参数:-F fs or –field-separator fs :指定输⼊⽂件折分隔符,fs 是⼀个字符串或者是⼀个正则表达式,如 -F:。
有时有可能进程没有启动,下⾯的功能是检查进程 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/f 的内容进⾏查看,得到进程句柄限制。句柄使⽤过⾼可能由于负载过⾼,句柄泄露等情况,通过脚本对业务进程句柄使⽤量进⾏时时监控,可以在异常时及时发送告警(例如通过短信),便于维护⼈员及时处理。下⾯的函数可获得指定进程 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)命令介绍
wc: 统计指定⽂件中的字节数、字数、⾏数 , 并将统计结果显⽰输出。参数:-l 统计⾏数。 -c 统计字节数。 -w 统计字数。
查看某个 TCP 或 UDP 端⼝是否在监听
端⼝检测是系统资源检测经常遇到的,特别是在⽹络通讯情况下,端⼝状态的检测往往是很重要的。有时可能进程,CPU,内存等处于正常状态,但是端⼝处于异常状态,业务也是没有正常运⾏。下⾯函数可判断指定端⼝是否在监听。它有⼀个参数为待检测端⼝,它⾸先使⽤netstat 输出端⼝占⽤信息,然后通过 grep, awk,wc 过滤输出监听 TCP 端⼝的个数,第⼆条语句为输出 UDP 端⼝的监听个数,如果 TCP 与 UDP 端⼝监听都为 0,返回 0,否则返回 1.
清单 6. 端⼝检测linux循环执行命令脚本
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)命令介绍
netstat: ⽤于显⽰与 IP、TCP、UDP 和 ICMP 协议相关的统计数据,⼀般⽤于检验本机各端⼝的⽹络连接情况。参数:-a 显⽰所有连线中的 Socket。 -n 直接使⽤ IP 地址,⽽不通过域名服务器。
下⾯的功能也是检测某个 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}'
命令介绍
egrep: 在⽂件内查指定的字符串。egrep 执⾏效果如 grep -E,使⽤的语法及参数可参照 grep 指令,与 grep 不同点在于解读字符串的⽅法,egrep 是⽤扩展的正则表达式语法来解读,⽽ grep 则⽤基本的正则表达式语法,扩展的正则表达式⽐基本的正则表达式有更完整的

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。