Shell脚本实现Linux系统和进程资源监控


Posted in Javascript onMarch 05, 2015

在服务器运维过程中,经常需要对服务器的各种资源进行监控,例如: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/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)命令介绍

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

查看某个 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)命令介绍

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 则用基本的正则表达式语法,扩展的正则表达式比基本的正则表达式有更完整的表达规范。

查看某个进程名正在运行的个数

有时我们可能需要得到服务器上某个进程的启动个数,下面的功能是检测某个进程正在运行的个数,例如进程名为 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)命令介绍

vmstat:Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU 活动进行监视。
参数: -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)命令介绍

df:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。 参数:-k 以 k 字节为单位显示。

总结

在 Linux 平台下,shell 脚本监控是一个非常简单,方便,有效的对服务器,进程进行监控的方法,对系统开发以及进程维护人员非常有帮助。它不仅可以对上面的信息进行监控,发送告警,同时也可以监控进程的日志等等的信息,希望本文对大家有帮助。

Javascript 相关文章推荐
js实现单一html页面两套css切换代码
Apr 11 Javascript
js data日期初始化的5种方法
Dec 29 Javascript
jquery制作弹窗提示窗口代码分享
Mar 02 Javascript
JQuery实现table行折叠效果以JSON做数据源
May 26 Javascript
javascript动态修改Li节点值的方法
Jan 20 Javascript
DOM基础教程之使用DOM控制表单
Jan 20 Javascript
JS获得图片alt信息的方法
Apr 01 Javascript
JQuery EasyUI Layout 在from布局自适应窗口大小的实现方法
May 28 Javascript
JS传值出现中文参数乱码的解决方法
Jun 30 Javascript
浅谈Vue.js
Mar 02 Javascript
在javaScript中检测数据类型的几种方式小结
Mar 04 Javascript
Vue3如何理解ref toRef和toRefs的区别
Feb 18 Vue.js
TinyMCE提交AjaxForm获取不到数据的解决方法
Mar 05 #Javascript
jQuery实现数秒后自动提交form的方法
Mar 05 #Javascript
Redis基本知识、安装、部署、配置笔记
Mar 05 #Javascript
深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP详解
Mar 05 #Javascript
PHP 数组current和next用法分享
Mar 05 #Javascript
深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP详解
Mar 05 #Javascript
深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解
Mar 05 #Javascript
You might like
php 检查电子邮件函数(自写)
2014/01/16 PHP
教你如何用php实现LOL数据远程获取
2014/06/10 PHP
PHP中用Trait封装单例模式的实现
2019/12/18 PHP
动态加载js的几种方法
2006/10/23 Javascript
用JQuery 实现AJAX加载XML并解析的脚本
2009/07/25 Javascript
js判断IE6/IE7/FF的代码[XMLHttpRequest]
2011/02/16 Javascript
js中数组Array的一些常用方法总结
2013/08/12 Javascript
jquery根据属性和index来查找属性值并操作
2014/07/25 Javascript
JavaScript时间转换处理函数
2015/04/14 Javascript
jquery简单实现幻灯片的方法
2015/08/03 Javascript
JavaScript 闭包详细介绍
2016/09/28 Javascript
EasyUI学习之Combobox级联下拉列表(2)
2016/12/29 Javascript
Bootstrap路径导航与分页学习使用
2017/02/08 Javascript
浅谈Node.js轻量级Web框架Express4.x使用指南
2017/05/03 Javascript
python与php实现分割文件代码
2017/03/06 Python
解决python3 json数据包含中文的读写问题
2018/05/10 Python
Python3数据库操作包pymysql的操作方法
2018/07/16 Python
用Python编写一个简单的CS架构后门的方法
2018/11/20 Python
pycharm 解除默认unittest模式的方法
2018/11/30 Python
Python3实现从排序数组中删除重复项算法分析
2019/04/03 Python
Django REST framework 分页的实现代码
2019/06/19 Python
python实现函数极小值
2019/07/10 Python
pandas DataFrame行或列的删除方法的实现示例
2019/08/02 Python
python 进程的几种创建方式详解
2019/08/29 Python
使用tensorboard可视化loss和acc的实例
2020/01/21 Python
Python如何在循环内使用list.remove()
2020/06/01 Python
python 实现有道翻译功能
2021/02/26 Python
时尚休闲吧创业计划书
2014/01/25 职场文书
教师个人成长总结
2015/02/11 职场文书
护士长2015年终工作总结
2015/04/24 职场文书
2016年6月份红领巾广播稿
2015/12/21 职场文书
2016党员干部廉政准则学习心得体会
2016/01/20 职场文书
学习党史心得体会2016
2016/01/23 职场文书
中秋节作文(五年级)之关于月亮
2019/09/11 职场文书
Pandas||过滤缺失数据||pd.dropna()函数的用法说明
2021/05/14 Python
安装配置mysql及Navicat prenium的详细流程
2021/06/10 MySQL