使用Shell来监控linux系统和进程(2)

来源:互联网 发布:网络咸鱼是什么意思 编辑:程序博客网 时间:2024/06/07 14:16

检测进程内存使用量

在对应用服务进行维护时,也经常遇到由于内存使用过大导致进程崩溃,造成业务中断的情况(例如32位程序可寻址的最大内存空间为4G,如果超出将申请内存失败,同时物理内存也是有限的)。内存使用过高可能由于内存泄露,消息堆积等情况,通过脚本对业务进程内存使用量进行时时监控,可以在内存使用量异常时及时发送告警(例如通过短信),便于维护人员及时处理。下面的函数可获得指定进程ID的进程内存使用情况。它有一个参数为进程ID,它首先使用ps查找进程信息,同时通过grep -v过滤掉VSZ行,然后通过除1000取以兆为单位的内存使用量。

清单4.对业务进程内存使用量进行监控

  1. function GetMem  
  2.  
  3. {  
  4.  
  5. MEMUsage=`ps -o vsz -p $1|grep -v VSZ`  
  6.  
  7. (( MEMUsage /= 1000))  
  8.  
  9. echo $MEMUsage  
  10.  

下面的功能是通过上面的函数GetMem获得此进程的内存使用,然后通过条件语句判断内存使用是否超过限制,如果超过1.6G(可以根据实际情况进行调整),则输出告警,否则输出正常信息。

清单5.判断内存使用是否超过限制

  1. mem=`GetMem $PID`  
  2.  
  3. if [ $mem -gt 1600 ]  
  4.  
  5. then  
  6.  
  7. {  
  8.  
  9. echo “The usage of memory is larger than 1.6G”  
  10.  
  11. }  
  12.  
  13. else  
  14.  
  15. {  
  16.  
  17. echo “The usage of memory is normal”  
  18.  
  19. }  
  20.  
  21. fi 

示例演示:

1)源程序(假设上面已经查询出CFTestApp的进程ID为11426)

  1. mem=`GetMem 11426`  
  2.  
  3. echo "The usage of memory is $mem M"  
  4.  
  5. if [ $mem -gt 1600 ]  
  6.  
  7. then  
  8.  
  9. {  
  10.  
  11. echo "The usage of memory is larger than 1.6G"  
  12.  
  13. }  
  14.  
  15. else  
  16.  
  17. {  
  18.  
  19. echo "The usage of memory is normal"  
  20.  
  21. }  
  22.  
  23. fi 

2)结果输出

  1. The usage of memory is 248 M  
  2.  
  3. The usage of memory is normal  
  4.  
  5. [dyu@xilinuxbldsrv shell]$ 

3)结果分析

从上面的输出可见:CFTestApp程序当前的内存使用为248M,是正常的,没有超过1.6G的告警限制。

检测进程句柄使用量

在对应用服务进行维护时,也经常遇到由于句柄使用过量导致业务中断的情况。每个平台对进程的句柄使用都是有限的,例如在Linux平台,我们可以使用ulimit – n 命令(open files (-n) 1024)或者对/etc/security/limits.conf的内容进行查看,得到进程句柄限制。句柄使用过高可能由于负载过高,句柄泄露等情况,通过脚本对业务进程句柄使用量进行时时监控,可以在异常时及时发送告警(例如通过短信),便于维护人员及时处理。下面的函数可获得指定进程ID的进程句柄使用情况。它有一个参数为进程ID,它首先使用ls输出进程句柄信息,然后通过wc -l统计输出句柄个数。

  1. function GetDes  
  2.  
  3. {  
  4.  
  5. DES=`ls /proc/$1/fd | wc -l`  
  6.  
  7. echo $DES  
  8.  

下面功能是通过上面的函数GetDes获得此进程的句柄使用量,然后通过条件语句判断句柄使用是否超过限制,如果超过900(可以根据实际情况进行调整)个,则输出告警,否则输出正常信息。

  1. des=` GetDes $PID`  
  2.  
  3. if [ $des -gt 900 ]  
  4.  
  5. then  
  6.  
  7. {  
  8.  
  9. echo “The number of des is larger than 900”  
  10.  
  11. }  
  12.  
  13. else  
  14.  
  15. {  
  16.  
  17. echo “The number of des is normal”  
  18.  
  19. }  
  20.  
  21. fi 

示例演示:

1)源程序(假设上面查询出CFTestApp的进程ID为11426)

  1. des=`GetDes 11426`  
  2.  
  3. echo "The number of des is $des"  
  4.  
  5. if [ $des -gt 900 ]  
  6.  
  7. then  
  8.  
  9. {  
  10.  
  11. echo "The number of des is larger than 900"  
  12.  
  13. }  
  14.  
  15. else  
  16.  
  17. {  
  18.  
  19. echo "The number of des is normal"  
  20.  
  21. }  
  22.  
  23. fi 

2)结果输出

  1. The number of des is 528  
  2.  
  3. The number of des is normal  
  4.  
  5. [dyu@xilinuxbldsrv shell]$ 

3)结果分析

从上面的输出可见:CFTestApp程序当前的句柄使用为528个,是正常的,没有超过900个的告警限制。

4)命令介绍

wc:统计指定文件中的字节数、字数、行数,并将统计结果显示输出。

参数:-l统计行数。

-c统计字节数。

-w统计字数。

使用Shell对系统资源进行监控

查看某个TCP或UDP端口是否在监听

端口检测是系统资源检测经常遇到的,特别是在网络通讯情况下,端口状态的检测往往是很重要的。有时可能进程,CPU,内存等处于正常状态,但是端口处于异常状态,业务也是没有正常运行。下面函数可判断指定端口是否在监听。它有一个参数为待检测端口,它首先使用netstat输出端口占用信息,然后通过grep, awk,wc过滤输出监听TCP端口的个数,第二条语句为输出UDP端口的监听个数,如果 TCP与UDP端口监听都为0,返回0,否则返回1.

清单6.端口检测

  1. function Listening  
  2.  
  3. {  
  4.  
  5. TCPListeningnum=`netstat -an | grep ":$1 " | \n  
  6.  
  7. awk '$1 == "tcp" && $NF == "LISTEN" {print $0}' | wc -l`  
  8.  
  9. UDPListeningnum=`netstat -an|grep ":$1 " \n  
  10.  
  11. |awk '$1 == "udp" && $NF == "0.0.0.0:*" {print $0}' | wc -l`  
  12.  
  13. (( Listeningnum = TCPListeningnum + UDPListeningnum ))  
  14.  
  15. if [ $Listeningnum == 0 ]  
  16.  
  17. then  
  18.  
  19. {  
  20.  
  21. echo "0"  
  22.  
  23. }  
  24.  
  25. else  
  26.  
  27. {  
  28.  
  29. echo "1"  
  30.  
  31. }  
  32.  
  33. fi  
  34.  

示例演示:

1)源程序(例如查询8080端口的状态是否在监听)

  1. isListen=`Listening 8080`  
  2.  
  3. if [ $isListen -eq 1 ]  
  4.  
  5. then  
  6.  
  7. {  
  8.  
  9. echo "The port is listening"  
  10.  
  11. }  
  12.  
  13. else  
  14.  
  15. {  
  16.  
  17. echo "The port is not listening"  
  18.  
  19. }  
  20.  
  21. fi 

2)结果输出

  1. The port is listening  
  2.  
  3. [dyu@xilinuxbldsrv shell]$ 

3)结果分析

从上面的输出可见:这个Linux服务器的8080端口处在监听状态。

4)命令介绍

netstat:用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。

参数:-a显示所有连线中的Socket。

-n直接使用IP地址,而不通过域名服务器。

下面的功能也是检测某个TCP或者UDP端口是否处在正常状态。

  1. tcp: netstat -an|egrep $1 |awk '$6 == "LISTEN" && $1 == "tcp" {print $0}'  
  2.  
  3. udp: netstat -an|egrep $1 |awk '$1 == "udp" && $5 == "0.0.0.0:*" {print $0}' 

命令介绍

egrep:在文件内查找指定的字符串。egrep执行效果如rep -E,使用的语法及参数可参照grep指令,与grep不同点在于解读字符串的方法,egrep是用扩展的正则表达式语法来解读,而grep则用基本的正则表达式语法,扩展的正则表达式比基本的正则表达式有更完整的表达规范。

0 0
原创粉丝点击