`
mizhihua
  • 浏览: 53810 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

shell-进程监控【转】

 
阅读更多

 

转自:http://www.ibm.com/developerworks/cn/linux/l-cn-shell-monitoring/

 

Shell 语言对于接触 LINUX 的人来说都比较熟悉,它是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。实际上 Shell 是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。它没有一般编程语言的“编译 - 链接 - 运行”过程。不仅如此,Shell 有自己的编程语言用于对命令的编辑,它允许用户编写由 shell 命令组成的程序。Shell 编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的 Shell 程序与其他应用程序具有同样的效果。当然,Shell 功能也是很强大的。Shell 有多种类型,其中最常用的几种是 Bourne shell(sh)、C shell(csh)和 Korn shell(ksh)。三种 shell 各有优缺点,Linux 操作系统缺省的 shell 一般是 Bourne Again shell,它是 Bourne shell 的扩展,简称 Bash,bash 的命令语法是 Bourne shell 命令语法的超集,并且在 Bourne shell 的基础上增加、增强了很多特性。在这里,我们以 Bash 做为实例总结了使用 Shell 对系统和进程资源进行监控的一些内容,希望对您能有帮助。

 

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

检查进程是否存在

在对进程进行监控时,我们一般需要得到该进程的 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 统计字数。

 

 

使用 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 脚本监控是一个非常简单,方便,有效的对服务器,进程进行监控的方法,对系统开发以及进程维护人员非常有帮助。它不仅可以对上面的信息进行监控,发送告警,同时也可以监控进程的日志等等的信息,希望本文对大家有帮助。

分享到:
评论

相关推荐

    shell脚本实现服务器进程监控的方法

    ### Shell 脚本实现服务器进程监控方法详解 在IT运维和开发环境中,服务器进程的稳定运行至关重要。本文将深入探讨如何使用Shell脚本实现服务器进程监控,这不仅有助于及时发现异常情况,还能提高系统的可用性和...

    shell-_-Linux-.zip_shell 进程

    在这个"shell-_-Linux-.zip_shell 进程"压缩包中,包含了一系列用于监控系统和进程资源的脚本,下面我们来详细探讨这些脚本及其涉及的知识点。 1. **function.inc**:这个文件通常包含了通用的函数定义,可以在其他...

    服务器监控内存、交换、进程监控、存储检查等-Shell-下载

    3. **进程监控**: 进程是系统运行的基本单位。`ps`命令可以列出当前系统中的所有进程,`ps -aux`是常用的一种展示方式。`top`或`htop`不仅能看到进程列表,还能显示每个进程的CPU和内存占用情况,便于定位高资源...

    Python库 | shell-util-0.1.10.tar.gz

    5. **进程管理**:启动、监控和控制子进程,例如检查进程状态、等待进程结束等。 6. **权限和所有权**:改变文件和目录的权限,或者修改所有者和组信息。 7. **批处理操作**:可能提供了批量执行命令或操作的功能,...

    Shell脚本中获取进程ID的方法

    提问: 我想要知道运行中脚本子shell的进程id。我该如何在shell脚本中得到PID。 当我在执行shell脚本时,它会启动一个叫子shell的进程...在bash中,子shell进程的PID存储在一个特殊的变量‘$$’中。这个变量只读,你不可

    Linux系统监控shell程序包-含内存cpu硬盘监控进程监控进程守护删除过期日志url监控webservice监控

    sysProcessMonitor.sh:系统进程监控脚本 sysWeblogicMonitorRestart.sh:系统weblogic监控重启(守护进程),当weblogic进程停止时调用脚本(startPssc.sh)自动重启 startPssc.sh:重启weblogic并生成带日期的...

    shell-文档资料

    Unix Shell提供了丰富的命令行工具和功能,如文件管理、进程控制、管道(pipe)和重定向。例如,`ls`用于列出目录内容,`cd`用于切换目录,`grep`用于搜索文本模式,而管道可以将一个命令的输出作为另一个命令的输入...

    Linux Shell 网络层监控脚本(监控包括:连接数、句柄数及根据监控反馈结果分析)

    Linux Shell 网络层监控脚本(监控包括:连接数、句柄数及根据监控反馈结果分析)

    用shell脚本监控进程是否存在 不存在则启动的实例

    通过上述介绍,我们可以了解到如何利用 Shell 脚本来实现进程监控与自动启动的功能。这种方法不仅提高了系统的可靠性,还减少了人工干预的需求。在实际部署时,可以根据具体情况调整脚本中的参数,以满足不同的需求...

    Linux-shell-command.rar_linux shell 运维_运维 shell

    7. **进程控制**:启动、停止、监控进程的命令,如`ps`查看进程,`kill`、`killall`发送信号终止进程,`nohup`让命令在后台持续运行。 8. **网络操作**:`ping`测试网络连通性,`netstat`查看网络状态,`telnet`、`...

    Liunx 进程监控 shell

    在Linux系统中,进程监控是系统管理的重要组成部分,它确保关键服务始终运行并能及时响应。`check_sms.sh`是一个shell脚本,用于检查特定进程的状态,并在必要时启动该进程,这样的脚本通常会配置为定时任务,如Cron...

    深入探究Windows平台客户端安全问题-进程地址空间入侵和白加黑高阶利用1

    5. 对进程的行为进行监控和分析 这些方法可以有效地防止进程地址空间入侵,但是需要更多的人去研究和完善。 五、结论 进程地址空间入侵是一种常见的安全问题,需要我们认真对待和防御。 Explorer Shell Extension...

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

    在Linux系统管理中,Shell脚本是常用的工具之一,它能帮助我们自动化各种任务,包括系统和进程资源的监控。本文将详细介绍如何使用Shell脚本来实现这些监控功能。 1. **检查进程是否存在** 使用`ps`命令可以查看...

    linux进程监控与自动重启的简单实现方法

    linux 下服务器程序会因为各种原因dump掉,就会影响用户使用,这里提供一个简单的进程监控和重启功能。 实现原理: 由定时任务crontab调用脚本,脚本用ps检查进程是否存在,如果不存在则重启并写入日志。 crontab...

    win连接linux-shell-x_5

    4. 连接成功后,你就进入了Linux服务器的Shell环境,可以执行各种命令,如文件管理、系统监控、程序部署等。 标签“linux-shell”表明这个主题主要关注的是Linux命令行操作。在Shell环境中,你可以利用各种Linux...

    分享实用监控脚本:使用Shell检查进程是否存在.doc

    本文将深入探讨如何使用Shell脚本来监控进程是否存在。 首先,我们要了解的是进程ID(PID)。PID是进程的唯一标识,在Linux系统中,每个进程都有一个唯一的PID。在某些情况下,可能有多个用户在同一台服务器上运行...

    Linux_Shell-programming.zip_Linux shell_linux

    了解以上基础知识后,可以编写出简单的Shell脚本,实现自动化任务,例如备份文件、监控系统状态、自动化测试等。随着技能的提升,还可以深入学习高级特性,如函数库、错误处理和调试技巧,以应对更复杂的系统管理...

    Shell脚本实现监控MySQL主从同步

    在这个文档中,作者详细介绍了如何使用Shell脚本来监控Linux系统下MySQL的主从同步状态,并且通过邮件通知管理员同步错误。以下是根据文档内容总结的关键知识点: 1. **Shell脚本的作用**:Shell脚本能够自动化执行...

    用shell写守护进程

    ### 用Shell编写守护进程详解 #### 知识点概览 1. **守护进程(Daemon)的概念** 2. **Shell脚本基础** 3. **Shell脚本中的进程管理** 4. **守护进程的设计与实现** 5. **错误处理与日志记录** #### 守护进程概念 ...

    shell-script

    Shell脚本支持远程执行,这使得它成为跨平台(如Unix/Linux系统)操作的首选语言之一,特别是在自动化部署、监控、数据备份等场景中。 Shell脚本的另一个优势在于其对系统资源的轻量级访问能力,这意味着它可以轻松...

Global site tag (gtag.js) - Google Analytics