使用Shell脚本对Linux系统和进程资源进行监控.docx
- 文档编号:15938438
- 上传时间:2023-07-09
- 格式:DOCX
- 页数:21
- 大小:34.63KB
使用Shell脚本对Linux系统和进程资源进行监控.docx
《使用Shell脚本对Linux系统和进程资源进行监控.docx》由会员分享,可在线阅读,更多相关《使用Shell脚本对Linux系统和进程资源进行监控.docx(21页珍藏版)》请在冰点文库上搜索。
使用Shell脚本对Linux系统和进程资源进行监控
使用Shell脚本对Linux系统和进程资源进行监控
发表于2012-06-2608:
58|6963次阅读|来源IBM开发者社区|1条评论|作者于东海,宋波,池辰
ShellLinux脚本
摘要:
Shell语言对于接触Linux的人来说都比较熟悉,它是系统的用户界面,提供了用户与内核进行交互操作的一种接口。
本文我们以Bash做为实例总结了使用Shell对系统和进程资源进行监控的一些内容,希望对您能有帮助。
Shell语言对于接触Linux的人来说都比较熟悉,它是系统的用户界面,提供了用户与内核进行交互操作的一种接口。
它接收用户输入的命令并把它送入内核去执行。
实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。
它没有一般编程语言的“编译-链接-运行”过程。
不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。
Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。
当然,Shell功能也是很强大的。
Shell有多种类型,其中最常用的几种是Bourneshell(sh)、Cshell(csh)和Kornshell(ksh)三种。
shell各有优缺点,Linux操作系统缺省的shell一般是BourneAgainshell,它是Bourneshell的扩展,简称Bash。
Bash的命令语法是Bourneshell命令语法的超集,并且在Bourneshell的基础上增加、增强了很多特性。
在这里,我们以Bash做为实例总结了使用Shell对系统和进程资源进行监控的一些内容,希望对您能有帮助。
检查进程是否存在
在对进程进行监控时,我们一般需要得到该进程的ID,进程ID是进程的唯一标识,但是有时可能在服务器上不同用户下运行着多个相同进程名的进程,下面的函数GetPID给出了获取指定用户下指定进程名的进程ID功能(目前只考虑这个用户下启动一个此进程名的进程),它有两个参数为用户名和进程名,它首先使用ps查找进程信息,同时通过grep过滤出需要的进程,最后通过sed和awk查找需要进程的ID值(此函数可根据实际情况修改,比如需要过滤其它信息等)。
清单1.对进程进行监控
1functionGetPID#User#Name
2
3{
4
5PsUser=$1
6
7PsName=$2
8
9pid=`ps-u$PsUser|grep$PsName|grep-vgrep|grep-vvi|grep-vdbx\n
10
11|grep-vtail|grep-vstart|grep-vstop|sed-n1p|awk'{print$1}'`
12
13echo$pid
14
15}
16
示例演示:
1)源程序(例如查找用户为root,进程名为CFTestApp的进程ID)
17PID=`GetPIDrootCFTestApp`
18
19echo$PID
2)结果输出
2011426
21
22[dyu@xilinuxbldsrvshell]$
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的处理文本和数据的方式:
它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。
如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。
参数:
-Ffsor–field-separatorfs:
指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:
。
有时有可能进程没有启动,下面的功能是检查进程ID是否存在,如果此进程没有运行输出:
23Theprocessdoesnotexist.
24#检查进程是否存在
25if["-$PID"=="-"]
26then
27{
28echo"Theprocessdoesnotexist."
29}
30fi
检测进程CPU利用率
在对应用服务进行维护时,我们经常遇到由于CPU过高导致业务阻塞,造成业务中断的情况。
CPU过高可能由于业务量过负荷或者出现死循环等异常情况,通过脚本对业务进程CPU进行时时监控,可以在CPU利用率异常时及时通知维护人员,便于维护人员及时分析,定位,以及避免业务中断等。
下面的函数可获得指定进程ID的进程CPU利用率。
它有一个参数为进程ID,它首先使用ps查找进程信息,同时通过grep-v过滤掉%CPU行,最后通过awk查找CPU利用百分比的整数部分(如果系统中有多个CPU,CPU利用率可以超过100%)。
清单2.对业务进程CPU进行实时监控
31functionGetCpu
32
33{
34
35CpuValue=`ps-p$1-opcpu|grep-vCPU|awk'{print$1}'|awk-F.'{print$1}'`
36
37echo$CpuValue
38
39}
下面的功能是通过上面的函数GetCpu获得此进程的CPU利用率,然后通过条件语句判断CPU利用率是否超过限制,如果超过80%(可以根据实际情况进行调整),则输出告警,否则输出正常信息。
清单3.判断CPU利用率是否超过限制
40functionCheckCpu
41
42{
43
44PID=$1
45
46cpu=`GetCpu$PID`
47
48if[$cpu-gt80]
49
50then
51
52{
53
54echo“Theusageofcpuislargerthan80%”
55
56}
57
58else
59
60{
61
62echo“Theusageofcpuisnormal”
63
64}
65
66fi
67
68}
示例演示:
1)源程序(假设上面已经查询出CFTestApp的进程ID为11426)
69CheckCpu11426
2)结果输出
70Theusageofcpuis75
71
72Theusageofcpuisnormal
73
74[dyu@xilinuxbldsrvshell]$
3)结果分析
从上面的输出可见:
CFTestApp程序当前的CPU使用为75%,是正常的,没有超过80%的告警限制。
检测进程内存使用量
在对应用服务进行维护时,也经常遇到由于内存使用过大导致进程崩溃,造成业务中断的情况(例如32位程序可寻址的最大内存空间为4G,如果超出将申请内存失败,同时物理内存也是有限的)。
内存使用过高可能由于内存泄露,消息堆积等情况,通过脚本对业务进程内存使用量进行时时监控,可以在内存使用量异常时及时发送告警(例如通过短信),便于维护人员及时处理。
下面的函数可获得指定进程ID的进程内存使用情况。
它有一个参数为进程ID,它首先使用ps查找进程信息,同时通过grep-v过滤掉VSZ行,然后通过除1000取以兆为单位的内存使用量。
清单4.对业务进程内存使用量进行监控
75functionGetMem
76
77{
78
79MEMUsage=`ps-ovsz-p$1|grep-vVSZ`
80
81((MEMUsage/=1000))
82
83echo$MEMUsage
84
85}
下面的功能是通过上面的函数GetMem获得此进程的内存使用,然后通过条件语句判断内存使用是否超过限制,如果超过1.6G(可以根据实际情况进行调整),则输出告警,否则输出正常信息。
清单5.判断内存使用是否超过限制
86mem=`GetMem$PID`
87
88if[$mem-gt1600]
89
90then
91
92{
93
94echo“Theusageofmemoryislargerthan1.6G”
95
96}
97
98else
99
100{
101
102echo“Theusageofmemoryisnormal”
103
104}
105
106fi
示例演示:
1)源程序(假设上面已经查询出CFTestApp的进程ID为11426)
107mem=`GetMem11426`
108
109echo"Theusageofmemoryis$memM"
110
111if[$mem-gt1600]
112
113then
114
115{
116
117echo"Theusageofmemoryislargerthan1.6G"
118
119}
120
121else
122
123{
124
125echo"Theusageofmemoryisnormal"
126
127}
128
129fi
2)结果输出
130Theusageofmemoryis248M
131
132Theusageofmemoryisnormal
133
134[dyu@xilinuxbldsrvshell]$
3)结果分析
从上面的输出可见:
CFTestApp程序当前的内存使用为248M,是正常的,没有超过1.6G的告警限制。
检测进程句柄使用量
在对应用服务进行维护时,也经常遇到由于句柄使用过量导致业务中断的情况。
每个平台对进程的句柄使用都是有限的,例如在Linux平台,我们可以使用ulimit–n命令(openfiles(-n)1024)或者对/etc/security/limits.conf的内容进行查看,得到进程句柄限制。
句柄使用过高可能由于负载过高,句柄泄露等情况,通过脚本对业务进程句柄使用量进行时时监控,可以在异常时及时发送告警(例如通过短信),便于维护人员及时处理。
下面的函数可获得指定进程ID的进程句柄使用情况。
它有一个参数为进程ID,它首先使用ls输出进程句柄信息,然后通过wc-l统计输出句柄个数。
135functionGetDes
136
137{
138
139DES=`ls/proc/$1/fd|wc-l`
140
141echo$DES
142
143}
下面功能是通过上面的函数GetDes获得此进程的句柄使用量,然后通过条件语句判断句柄使用是否超过限制,如果超过900(可以根据实际情况进行调整)个,则输出告警,否则输出正常信息。
144des=`GetDes$PID`
145
146if[$des-gt900]
147
148then
149
150{
151
152echo“Thenumberofdesislargerthan900”
153
154}
155
156else
157
158{
159
160echo“Thenumberofdesisnormal”
161
162}
163
164fi
示例演示:
1)源程序(假设上面查询出CFTestApp的进程ID为11426)
165des=`GetDes11426`
166
167echo"Thenumberofdesis$des"
168
169if[$des-gt900]
170
171then
172
173{
174
175echo"Thenumberofdesislargerthan900"
176
177}
178
179else
180
181{
182
183echo"Thenumberofdesisnormal"
184
185}
186
187fi
2)结果输出
188Thenumberofdesis528
189
190Thenumberofdesisnormal
191
192[dyu@xilinuxbldsrvshell]$
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.端口检测
193functionListening
194
195{
196
197TCPListeningnum=`netstat-an|grep":
$1"|\n
198
199awk'$1=="tcp"&&$NF=="LISTEN"{print$0}'|wc-l`
200
201UDPListeningnum=`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
207if[$Listeningnum==0]
208
209then
210
211{
212
213echo"0"
214
215}
216
217else
218
219{
220
221echo"1"
222
223}
224
225fi
226
227}
示例演示:
1)源程序(例如查询8080端口的状态是否在监听)
228isListen=`Listening8080`
229
230if[$isListen-eq1]
231
232then
233
234{
235
236echo"Theportislistening"
237
238}
239
240else
241
242{
243
244echo"Theportisnotlistening"
245
246}
247
248fi
2)结果输出
249Theportislistening
250
251[dyu@xilinuxbldsrvshell]$
3)结果分析
从上面的输出可见:
这个Linux服务器的8080端口处在监听状态。
4)命令介绍
netstat:
用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。
参数:
-a显示所有连线中的Socket。
-n直接使用IP地址,而不通过域名服务器。
下面的功能也是检测某个TCP或者UDP端口是否处在正常状态。
252tcp:
netstat-an|egrep$1|awk'$6=="LISTEN"&&$1=="tcp"{print$0}'
253
254udp:
netstat-an|egrep$1|awk'$1=="udp"&&$5=="0.0.0.0:
*"{print$0}'
命令介绍
egrep:
在文件内查找指定的字符串。
egrep执行效果如rep-E,使用的语法及参数可参照grep指令,与grep不同点在于解读字符串的方法,egrep是用扩展的正则表达式语法来解读,而grep则用基本的正则表达式语法,扩展的正则表达式比基本的正则表达式有更完整的表达规范。
查看某个进程名正在运行的个数
有时我们可能需要得到服务器上某个进程的启动个数,下面的功能是检测某个进程正在运行的个数,例如进程名为CFTestApp。
255Runnum=`ps-ef|grep-vvi|grep-vtail|grep"[/]CFTestApp"|grep-vgrep|wc-l
检测系统CPU负载
在对服务器进行维护时,有时也遇到由于系统CPU(利用率)负载过量导致业务中断的情况。
服务器上可能运行多个进程,查看单个进程的CPU都是正常的,但是整个系统的CPU负载可能是异常的。
通过脚本对系统CPU负载进行时时监控,可以在异常时及时发送告警,便于维护人员及时处理,预防事故发生。
下面的函数可以检测系统CPU使用情况.使用vmstat取5次系统CPU的idle值,取平均值,然后通过与100取差得到当前CPU的实际占用值。
256functionGetSysCPU
257
258{
259
260CpuIdle=`vmstat15|sed-n'3,$p'\n
261
262|awk'{xx=x+$15}END{printx/5}'|awk-F.'{print$1}'
263
264CpuNum=`echo"100-$CpuIdle"|bc`
265
266echo$CpuNum
267
268}
示例演示:
1)源程序
269cpu=`GetSysCPU`
270
271echo"ThesystemCPUis$cpu"
272
273if[$cpu-gt90]
274
275then
276
277{
278
279echo"Theusageofsystemcpuislargerthan90%"
280
281}
282
283else
284
285{
286
287echo"Theusageofsystemcpuisnormal"
288
289}
290
291fi
2)结果输出
292ThesystemCPUis87
293
294Theusageofsystemcpuisnormal
295
296[dyu@xilinuxbldsrvshell]$
3)结果分析
从上面的输出可见:
当前Linux服务器系统CPU利用率为87%,是正常的,没有超过90%的告警限制。
4)命令介绍
vmstat:
VirtualMeomoryStatistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监视。
参数:
-n表示在周期性循环输出时,输出的头部信息仅显示一次。
检测系统磁盘空间
系统磁盘空间检测是系统资源检测的重要部分,在系统维护维护中,我们经常需要查看服务器磁盘空间使用情况。
因为有些业务要时时写话单,日志,或者临时文件等,如果磁盘空间用尽,也可能会导致业务中断,下面的函数可以检测当前系统磁盘空间中某个目录的磁盘空间使用情况。
输入参数为需要检测的目录名,使用df输出系统磁盘空间使用信息,然后通过grep和awk过滤得到某个目录的磁盘空间使用百分比。
297functionGetDiskSpc
298
299{
300
301if[$#-ne1]
302
303then
304
305return1
306
307fi
308
309Folder="$1$"
310
311DiskSpace=`df-k|grep$Folder|awk'{print$5}'|awk-F%'{print$1}'
312
313echo$DiskSpace
314
315}
示例演示:
1)源程序(检测目录为/boot)
316Folder="/boot"
317
318DiskSpace=`GetDiskSpc$Folder`
319
320echo"Thesystem$Folderdiskspaceis$DiskSpace%"
321
322if[$DiskSpace-gt90]
323
324then
325
326{
327
328echo"Theusageofsystemdisk($Folder)islargerthan90%"
329
330}
331
332else
333
334{
335
336echo"Theusageofsystemdisk($Folder)isnormal"
337
338}
339
340fi
2)结果输出
341Thesystem/bootdiskspaceis14%
342
343Theusageofsystemdisk(/boot)isnormal
344
345[dyu@xilinuxbldsrvshell]$
3)结果分析
从上面的输出可见:
当前此Linux服务器系统上/boot目录的磁盘空间已
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用 Shell 脚本 Linux 系统 进程 资源 进行 监控
![提示](https://static.bingdoc.com/images/bang_tan.gif)