一般情況下,我們隻需要監控程式程序在沒在就可以了。但是這次遭遇了這樣的事,公司開發的程式,程式程序還在,但是死鎖了。導緻大範圍的影響,更要命的是根本不知道問題出在哪裡,還是别的測試部同僚幫忙發現的,真是丢盡運維的臉了…
為避免下次再遭遇到這樣的情況,分析了這次程序死鎖的現象,發現死鎖會占用100%的cpu,正常情況下隻占用10%以内。決定編寫nagios插件,用來監控程式占用的資源,包括cpu,記憶體等。
能設定cpu,mem的門檻值,資源占用超過門檻值就報警。
要能判斷這個程序是否存在,若有一個不存在,則報警。
1、如果輸入格式不正确,則輸出幫助資訊
[root@center230 libexec]# shcomponent_resource.sh
Usage parament:
component_resource.sh [--cpu] [--mem]
Example:
component_resource.sh --cpu 50 --mem 50
2、若沒超出門檻值,輸出資源占用情況,退出值為0
[root@center230 libexec]# shcomponent_resource.sh --cpu 50 --mem 50
VueSERVER_cpu_use=5.6% VueCache_cpu_use=1.9%VueAgent_cpu_use=0.0% VueCenter_cpu_use=0.0% VueDaemon_cpu_use=0.0%;VueSERVER_mem_use=0.2% VueCache_mem_use=7.4% VueAgent_mem_use=0.5% VueCenter_mem_use=0.1%VueDaemon_mem_use=0.0%
[root@center230 libexec]# echo $?
3、若超出門檻值,輸出資源占用情況,退出值為2
[root@center230 libexec]# shcomponent_resource.sh --cpu 5 --mem 5
VueSERVER_cpu_use=9.4% VueCache_cpu_use=0.0%VueAgent_cpu_use=0.0% VueCenter_cpu_use=0.0% VueDaemon_cpu_use=0.0%;VueSERVER_mem_use=0.2% VueCache_mem_use=7.4% VueAgent_mem_use=0.5%VueCenter_mem_use=0.1% VueDaemon_mem_use=0.0%
2
4、若程序不存在,輸出down掉的程序,以及正常使用中的程序資源情況,退出值為2
[root@yckj scripts]# sh component_resource.sh--cpu 50 --mem 50
Current VueDaemon VueCenter VueAgent VueCache VueSERVER is down.
[root@yckj scripts]# echo $?
1
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<code>[root@center230 libexec]</code><code># catcomponent_resource.sh</code>
<code>#!/bin/sh</code>
<code>#author:yangrong</code>
<code>#date:2014-05-20</code>
<code>#mail:[email protected]</code>
<code> </code>
<code>#pragrom_list=(VueDaemon VueCenter VueAgentVueCache VueSERVER VUEConnector Myswitch Slirpvde)</code>
<code>pragrom_list=(VueDaemon VueCenter VueAgentVueCache VueSERVER)</code>
<code>####擷取cpu門檻值和mem門檻值#######</code>
<code>case</code> <code>$1 </code><code>in</code>
<code> </code><code>--cpu)</code>
<code> </code><code>cpu_crit=$2</code>
<code> </code><code>;;</code>
<code> </code><code>--mem)</code>
<code> </code><code>mem_crit=$2</code>
<code>esac</code>
<code>case</code> <code>$3 </code><code>in</code>
<code> </code><code>cpu_crit=$4</code>
<code> </code><code>mem_crit=$4</code>
<code>###判斷傳參數量,如果不為4,則var值為1,var0則正常####</code>
<code>if</code> <code>[[ $1 == $3 ]];</code><code>then</code>
<code> </code><code>var=1 </code>
<code>elif</code> <code>[ $</code><code># -ne 4 ] ;then</code>
<code> </code><code>var=1</code>
<code>else</code>
<code> </code><code>var=0</code>
<code>fi</code>
<code>###列印錯誤提示資訊</code>
<code>if</code> <code>[ $var -</code><code>eq</code> <code>1 ];</code><code>then</code>
<code> </code><code>echo</code> <code>"Usage parament:"</code>
<code> </code><code>echo</code> <code>" $0 [--cpu][--mem]"</code>
<code> </code><code>echo</code> <code>""</code>
<code> </code><code>echo</code> <code>"Example:"</code>
<code> </code><code>echo</code> <code>" $0 --cpu 50 --mem50"</code>
<code> </code><code>exit</code>
<code>###把不存在的程序放一變量中</code>
<code>num=$(( ${</code><code>#pragrom_list[@]}-1 ))</code>
<code>NotExist=</code><code>""</code>
<code>for</code> <code>digit </code><code>in</code> <code>`</code><code>seq</code> <code>0 $num`</code>
<code>do</code>
<code> </code><code>a=`</code><code>ps</code> <code>-ef|</code><code>grep</code> <code>-</code><code>v</code> <code>grep</code> <code>|</code><code>grep</code> <code>${pragrom_list[$digit]}|</code><code>wc</code> <code>-l`</code>
<code> </code><code>if</code><code>[ $a -</code><code>eq</code> <code>0 ];</code><code>then</code>
<code> </code><code>NotExist=</code><code>"$NotExist ${pragrom_list[$digit]}"</code>
<code> </code><code>unset</code> <code>pragrom_list[$digit]</code>
<code> </code><code>fi</code>
<code>done</code>
<code>#echo"pragrom_list=${pragrom_list[@]}"</code>
<code>####對比程序所占資源與門檻值大小</code>
<code>cpu_use_all=</code><code>""</code>
<code>mem_use_all=</code><code>""</code>
<code>compare_cpu_temp=0</code>
<code>compare_mem_temp=0</code>
<code>for</code> <code>n </code><code>in</code> <code>${pragrom_list[@]}</code>
<code> </code><code>cpu_use=`</code><code>top</code> <code>-b -n1|</code><code>grep</code> <code>$n|</code><code>awk</code> <code>'{print $9}'</code><code>`</code>
<code> </code><code>mem_use=`</code><code>top</code> <code>-b -n1|</code><code>grep</code> <code>$n|</code><code>awk</code> <code>'{print $10}'</code><code>`</code>
<code> </code><code>if</code><code>[[ $cpu_use == </code><code>""</code> <code>]];</code><code>then</code>
<code> </code><code>cpu_use=0</code>
<code> </code><code>fi</code>
<code> </code><code>if</code><code>[[ $mem_use == </code><code>""</code> <code>]];</code><code>then</code>
<code> </code><code>mem_use=0</code>
<code> </code><code>compare_cpu=`</code><code>echo</code> <code>"$cpu_use > $cpu_crit"</code><code>|</code><code>bc</code><code>`</code>
<code> </code><code>compare_mem=`</code><code>echo</code> <code>"$mem_use > $mem_crit"</code><code>|</code><code>bc</code><code>` </code>
<code> </code><code>if</code><code>[[ $compare_cpu == 1 ]];</code><code>then</code>
<code> </code><code>compare_cpu_temp=1</code>
<code> </code><code>if</code><code>[[ $compare_mem == 1 ]];</code><code>then</code>
<code> </code><code>compare_mem_temp=1</code>
<code> </code><code>cpu_use_all=</code><code>"${n}_cpu_use=${cpu_use}% ${cpu_use_all}"</code>
<code> </code><code>mem_use_all=</code><code>"${n}_mem_use=${mem_use}% ${mem_use_all}"</code>
<code>###如果該變量有值,則代表有程序down。則退出值為2</code>
<code>if</code> <code>[[ </code><code>"$NotExist"</code> <code>!= </code><code>""</code><code>]];</code><code>then</code>
<code> </code><code>echo</code> <code>-e </code><code>"Current ${NotExist} isdown.$cpu_use_all;$mem_use_all"</code>
<code> </code><code>exit</code> <code>2</code>
<code>###如果cpu比較值為1,則代表有程序占用超過門檻值,則退出值為2</code>
<code>elif</code> <code>[[ </code><code>"$compare_cpu_temp"</code> <code>== 1]];</code><code>then</code>
<code> </code><code>echo</code> <code>-e </code><code>"$cpu_use_all;$mem_use_all"</code>
<code> </code><code>exit</code> <code>2</code>
<code>##如果mem比較值為1,則代表為程序mem占用超過門檻值,則退出值為2</code>
<code>elif</code> <code>[[ $compare_mem_temp == 1 ]];</code><code>then</code>
<code>##否則則正常輸出,并輸出所占cpu與記憶體比例</code>
<code> </code><code>exit</code> <code>0</code>
随着近日編寫shell腳本越來越多,有時難免會回改以前所寫腳本,經常要看一段時間才能看懂。
為友善後續的維護,在腳本當中,每一個函數,每一段功能,都做備注,友善以後自己或他人來進行維護。
本文轉自楊雲1028 51CTO部落格,原文連結:http://blog.51cto.com/yangrong/1414345,如需轉載請自行聯系原作者