使用Shell脚本对Linux系统和进程资源进行监控_第1页
使用Shell脚本对Linux系统和进程资源进行监控_第2页
使用Shell脚本对Linux系统和进程资源进行监控_第3页
使用Shell脚本对Linux系统和进程资源进行监控_第4页
使用Shell脚本对Linux系统和进程资源进行监控_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

使用Shell脚本对Linux系统和进程资源进行监控发表于2012-06-26 08:58| 6963次阅读| 来源IBM开发者社区| 1 条评论| 作者于东海,宋波,池辰ShellLinux脚本摘要:Shell语言对于接触Linux的人来说都比较熟悉,它是系统的用户界面,提供了用户与内核进行交互操作的一种接口。本文我们以Bash做为实例总结了使用Shell对系统和进程资源进行监控的一些内容,希望对您能有帮助。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对系统和进程资源进行监控的一些内容,希望对您能有帮助。 检查进程是否存在在对进程进行监控时,我们一般需要得到该进程的ID,进程ID是进程的唯一标识,但是有时可能在服务器上不同用户下运行着多个相同进程名的进程,下面的函数GetPID给出了获取指定用户下指定进程名的进程ID功能(目前只考虑这个用户下启动一个此进程名的进程),它有两个参数为用户名和进程名,它首先使用ps查找进程信息,同时通过grep过滤出需要的进程,最后通过sed和awk查找需要进程的ID值(此函数可根据实际情况修改,比如需要过滤其它信息等)。清单1.对进程进行监控1 function GetPID #User #Name 2 3 4 5 PsUser=$1 6 7 PsName=$2 8 9 pid=ps -u $PsUser|grep $PsName|grep -v grep|grep -v vi|grep -v dbxn 10 11 |grep -v tail|grep -v start|grep -v stop |sed -n 1p |awk print $1 12 13 echo $pid 14 15 16 示例演示:1)源程序(例如查找用户为root,进程名为CFTestApp的进程 ID)17 PID=GetPID root CFTestApp 18 19 echo $PID 2)结果输出20 11426 21 22 dyuxilinuxbldsrv 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是否存在,如果此进程没有运行输出:23 The process does not exist. 24 # 检查进程是否存在 25 if -$PID = - 26 then 27 28 echo The process does not exist. 29 30 fi 检测进程CPU利用率在对应用服务进行维护时,我们经常遇到由于CPU过高导致业务阻塞,造成业务中断的情况。CPU过高可能由于业务量过负荷或者出现死循环等异常情况,通过脚本对业务进程CPU进行时时监控,可以在CPU利用率异常时及时通知维护人员,便于维护人员及时分析,定位,以及避免业务中断等。下面的函数可获得指定进程ID的进程CPU利用率。它有一个参数为进程ID,它首先使用ps查找进程信息,同时通过grep -v过滤掉%CPU行,最后通过awk查找CPU利用百分比的整数部分(如果系统中有多个CPU,CPU利用率可以超过100%)。清单2.对业务进程CPU进行实时监控31 function GetCpu 32 33 34 35 CpuValue=ps -p $1 -o pcpu |grep -v CPU | awk print $1 | awk - F. print $1 36 37 echo $CpuValue 38 39 下面的功能是通过上面的函数GetCpu获得此进程的CPU利用率,然后通过条件语句判断CPU利用率是否超过限制,如果超过80%(可以根据实际情况进行调整),则输出告警,否则输出正常信息。清单3.判断CPU利用率是否超过限制40 function CheckCpu 41 42 43 44 PID=$1 45 46 cpu=GetCpu $PID 47 48 if $cpu -gt 80 49 50 then 51 52 53 54 echo “The usage of cpu is larger than 80%” 55 56 57 58 else 59 60 61 62 echo “The usage of cpu is normal” 63 64 65 66 fi 67 68 示例演示:1)源程序(假设上面已经查询出CFTestApp的进程ID为11426)69 CheckCpu 11426 2)结果输出70 The usage of cpu is 75 71 72 The usage of cpu is normal 73 74 dyuxilinuxbldsrv shell$ 3)结果分析从上面的输出可见:CFTestApp程序当前的CPU使用为75%,是正常的,没有超过80%的告警限制。检测进程内存使用量在对应用服务进行维护时,也经常遇到由于内存使用过大导致进程崩溃,造成业务中断的情况(例如32位程序可寻址的最大内存空间为4G,如果超出将申请内存失败,同时物理内存也是有限的)。内存使用过高可能由于内存泄露,消息堆积等情况,通过脚本对业务进程内存使用量进行时时监控,可以在内存使用量异常时及时发送告警(例如通过短信),便于维护人员及时处理。下面的函数可获得指定进程ID的进程内存使用情况。它有一个参数为进程ID,它首先使用ps查找进程信息,同时通过grep -v过滤掉VSZ行,然后通过除1000取以兆为单位的内存使用量。清单4.对业务进程内存使用量进行监控75 function GetMem 76 77 78 79 MEMUsage=ps -o vsz -p $1|grep -v VSZ 80 81 ( MEMUsage /= 1000) 82 83 echo $MEMUsage 84 85 下面的功能是通过上面的函数GetMem获得此进程的内存使用,然后通过条件语句判断内存使用是否超过限制,如果超过1.6G(可以根据实际情况进行调整),则输出告警,否则输出正常信息。清单5.判断内存使用是否超过限制86 mem=GetMem $PID 87 88 if $mem -gt 1600 89 90 then 91 92 93 94 echo “The usage of memory is larger than 1.6G” 95 96 97 98 else 99 100 101 102 echo “The usage of memory is normal” 103 104 105 106 fi 示例演示:1)源程序(假设上面已经查询出CFTestApp的进程ID为11426)107 mem=GetMem 11426 108 109 echo The usage of memory is $mem M 110 111 if $mem -gt 1600 112 113 then 114 115 116 117 echo The usage of memory is larger than 1.6G 118 119 120 121 else 122 123 124 125 echo The usage of memory is normal 126 127 128 129 fi 2)结果输出130 The usage of memory is 248 M 131 132 The usage of memory is normal 133 134 dyuxilinuxbldsrv shell$ 3)结果分析从上面的输出可见:CFTestApp程序当前的内存使用为248M,是正常的,没有超过1.6G的告警限制。检测进程句柄使用量在对应用服务进行维护时,也经常遇到由于句柄使用过量导致业务中断的情况。每个平台对进程的句柄使用都是有限的,例如在Linux平台,我们可以使用ulimit n 命令(open files (-n) 1024)或者对/etc/security/limits.conf的内容进行查看,得到进程句柄限制。句柄使用过高可能由于负载过高,句柄泄露等情况,通过脚本对业务进程句柄使用量进行时时监控,可以在异常时及时发送告警(例如通过短信),便于维护人员及时处理。下面的函数可获得指定进程ID的进程句柄使用情况。它有一个参数为进程ID,它首先使用ls输出进程句柄信息,然后通过wc -l统计输出句柄个数。135 function GetDes 136 137 138 139 DES=ls /proc/$1/fd | wc -l 140 141 echo $DES 142 143 下面功能是通过上面的函数GetDes获得此进程的句柄使用量,然后通过条件语句判断句柄使用是否超过限制,如果超过900(可以根据实际情况进行调整)个,则输出告警,否则输出正常信息。144 des= GetDes $PID 145 146 if $des -gt 900 147 148 then 149 150 151 152 echo “The number of des is larger than 900” 153 154 155 156 else 157 158 159 160 echo “The number of des is normal” 161 162 163 164 fi 示例演示:1)源程序(假设上面查询出CFTestApp的进程ID为11426)165 des=GetDes 11426 166 167 echo The number of des is $des 168 169 if $des -gt 900 170 171 then 172 173 174 175 echo The number of des is larger than 900 176 177 178 179 else 180 181 182 183 echo The number of des is normal 184 185 186 187 fi 2)结果输出188 The number of des is 528 189 190 The number of des is normal 191 192 dyuxilinuxbldsrv 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.端口检测193 function Listening 194 195 196 197 TCPListeningnum=netstat -an | grep :$1 | n 198 199 awk $1 = tcp & $NF = LISTEN print $0 | wc -l 200 201 UDPListeningnum=netstat -an|grep :$1 n 202 203 |awk $1 = udp & $NF = 0.0.0.0:* print $0 | wc -l 204 205 ( Listeningnum = TCPListeningnum + UDPListeningnum ) 206 207 if $Listeningnum = 0 208 209 then 210 211 212 213 echo 0 214 215 216 217 else 218 219 220 221 echo 1 222 223 224 225 fi 226 227 示例演示:1)源程序(例如查询8080端口的状态是否在监听)228 isListen=Listening 8080 229 230 if $isListen -eq 1 231 232 then 233 234 235 236 echo The port is listening 237 238 239 240 else 241 242 243 244 echo The port is not listening 245 246 247 248 fi 2)结果输出249 The port is listening 250 251 dyuxilinuxbldsrv shell$ 3)结果分析从上面的输出可见:这个Linux服务器的8080端口处在监听状态。4)命令介绍netstat:用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。参数:-a显示所有连线中的Socket。-n直接使用IP地址,而不通过域名服务器。下面的功能也是检测某个TCP或者UDP端口是否处在正常状态。252 tcp: netstat -an|egrep $1 |awk $6 = LISTEN & $1 = tcp print $0 253 254 udp: netstat -an|egrep $1 |awk $1 = udp & $5 = 0.0.0.0:* print $0 命令介绍egrep:在文件内查找指定的字符串。egrep执行效果如rep -E,使用的语法及参数可参照grep指令,与grep不同点在于解读字符串的方法,egrep是用扩展的正则表达式语法来解读,而grep则用基本的正则表达式语法,扩展的正则表达式比基本的正则表达式有更完整的表达规范。查看某个进程名正在运行的个数有时我们可能需要得到服务器上某个进程的启动个数,下面的功能是检测某个进程正在运行的个数,例如进程名为CFTestApp。255 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的实际占用值。256 function GetSysCPU 257 258 259 260 CpuIdle=vmstat 1 5 |sed -n 3,$p n 261 262 |awk xx = x + $15 END print x/5 |awk -F. print $1 263 264 CpuNum=echo 100-$CpuIdle | bc 265 266 echo $CpuNum 267 268 示例演示:1)源程序269 cpu=GetSysCPU 270 271 echo The system CPU is $cpu 272 273 if $cpu -gt 90 274 275 then 276 277 278 279 echo The usage of system cpu is larger than 90% 280 281 282 283 else 284 285 286 287 echo The usage of system cpu is normal 288 289 290 291 fi 2)结果输出292 The system CPU is 87 293 294 The usage of system cpu is normal 295 296 dyuxilinuxbldsrv shell$ 3)结果分析从上面的输出可见:当前Linux服务器系统CPU利用率为87%,是正常的,没有超过90%的告警限制。4)命令介绍vmstat:Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监视。参数:-n表示在周期性循环输出时,输出的头部信息仅显示一次。检测系统磁盘空间系统磁盘空间检测是系统资源检测的重要部分,在系统维护维护中,我们经常需要查看服务器磁盘空间使用情况。因为有些业务要时时写话单,日志,或者临时文件等,如果磁盘空间用尽,也可能会导致业务中断,下面的函数可以检测当前系统磁盘空间中某个目录的磁盘空间使用情况。输入参数为需要检测的目录名,使用df输出系统磁盘空间使用信息,然后通过grep和awk过滤得到某个目录的磁盘空间使用百分比。297 function GetDiskSpc 298 299 300 301 if $# -ne

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论