天天看點

Nagios插件開發之監控程式占用資源

   一般情況下,我們隻需要監控程式程序在沒在就可以了。但是這次遭遇了這樣的事,公司開發的程式,程式程序還在,但是死鎖了。導緻大範圍的影響,更要命的是根本不知道問題出在哪裡,還是别的測試部同僚幫忙發現的,真是丢盡運維的臉了…

為避免下次再遭遇到這樣的情況,分析了這次程序死鎖的現象,發現死鎖會占用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 &gt; $cpu_crit"</code><code>|</code><code>bc</code><code>`</code>

<code>  </code><code>compare_mem=`</code><code>echo</code> <code>"$mem_use &gt; $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,如需轉載請自行聯系原作者