设为首页 收藏本站
查看: 731|回复: 0

8个非常实用的Linux系统监控shell脚本

[复制链接]

尚未签到

发表于 2018-8-26 08:14:20 | 显示全部楼层 |阅读模式
  在服务器运维过程中,经常需要对服务器的各种资源进行监控,例如: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.总结
检查进程是否存在

  在对进程进行监控时,我们一般需要得到该进程的>清单 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 的进程>PID=`GetPID root CFTestApp`  

  
    echo $PID
  2)结果输出
11426  
    [dyu@xilinuxbldsrv shell]$
  3)结果分析

  从上面的输出可见:11426 为 root 用户下的 CFTestApp 程序的进程>  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:。

  有时有可能进程没有启动,下面的功能是检查进程>The process does not exist.  
    # 检查进程是否存在
  
    if [ "-$PID" == "-" ]
  
    then
  
    {
  
        echo "The process does not exist."
  
    }
  
    fi
检测进程 CPU 利用率

  在对应用服务进行维护时,我们经常遇到由于 CPU 过高导致业务阻塞,造成业务中断的情况。CPU 过高可能由于业务量过负荷或者出现死循环等异常情况,通过脚本对业务进程 CPU 进行时时监控,可以在 CPU 利用率异常时及时通知维护人员,便于维护人员及时分析,定位,以及避免业务中断等。下面的函数可获得指定进程>清单 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 的进程>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,如果超出将申请内存失败,同时物理内存也是有限的)。内存使用过高可能由于内存泄露,消息堆积等情况,通过脚本对业务进程内存使用量进行时时监控,可以在内存使用量异常时及时发送告警(例如通过短信),便于维护人员及时处理。下面的函数可获得指定进程>清单 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 的进程>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 的内容进行查看,得到进程句柄限制。句柄使用过高可能由于负载过高,句柄泄露等情况,通过脚本对业务进程句柄使用量进行时时监控,可以在异常时及时发送告警(例如通过短信),便于维护人员及时处理。下面的函数可获得指定进程>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 的进程>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 的>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 脚本监控是一个非常简单,方便,有效的对服务器,进程进行监控的方法,对系统开发以及进程维护人员非常有帮助。它不仅可以对上面的信息进行监控,发送告警,同时也可以监控进程的日志等等的信息,希望本文对大家有帮助。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-556571-1-1.html 上篇帖子: [shell] 让你提升命令行效率的 Bash 快捷键 [完整版] 下篇帖子: 你不知道的shell用法和脚本,简单&强大
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表