使用 shell 脚本对 Linux 系统和进程资源进行监控

使用 Shell 对进程资源进行监控

检查进程是否存在

在对进程进行监控时,咱们通常须要获得该进程的 ID,进程 ID 是进程的惟一标识,可是有时可能在服务器上不一样用户下运行着多个相同进程名的进程,下面的函数 GetPID 给出了获取指定用户下指定进程名的进程 ID 功能(目前只考虑这个用户下启动一个此进程名的进程),它有两个参数为用户名和进程名,它首先使用 ps 查找进程信息,同时经过 grep 过滤出须要的进程,最后经过 sed 和 awk 查找须要进程的 ID 值(此函数可根据实际状况修改,好比须要过滤其它信息等)。linux

清单 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)shell

    PID=`GetPID root CFTestApp` 
 
    echo $PID

2)结果输出编程

    11426 
    [dyu@xilinuxbldsrv shell]$

3)结果分析服务器

从上面的输出可见:11426 为 root 用户下的 CFTestApp 程序的进程 ID。网络

4)命令介绍tcp

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 统计字数。

回页首

使用 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)命令介绍

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 脚本监控是一个很是简单,方便,有效的对服务器,进程进行监控的方法,对系统开发以及进程维护人员很是有帮助。它不只能够对上面的信息进行监控,发送告警,同时也能够监控进程的日志等等的信息,但愿本文对你们有帮助

相关文章
相关标签/搜索