天天看點

shell腳本實作LLD監控

要實作Zabbix LLD監控,通常需要兩個腳本,一個自定義發現check腳本,并輸出成Json格式,另一個才是擷取監控項values的腳本。

自定義發現checks腳本輸出結果為以下形式:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

<code>{</code>

<code>    </code><code>"data"</code><code>: [</code>

<code>        </code><code>{</code>

<code>            </code><code>"{#APP_NAME}"</code><code>: </code><code>"AppCMDB"</code>

<code>        </code><code>}, </code>

<code>            </code><code>"{#APP_NAME}"</code><code>: </code><code>"AppMerchantWebApi"</code>

<code>            </code><code>"{#APP_NAME}"</code><code>: </code><code>"AppNOC"</code>

<code>            </code><code>"{#APP_NAME}"</code><code>: </code><code>"AppSSO"</code>

<code>        </code><code>}</code>

<code>    </code><code>]</code>

<code>}</code>

用python寫這樣的腳本非常友善,那麼如何用shell寫呢?

先看一個執行個體:

公司需要生生産伺服器的APP程序進行監控,監控項為CPU使用率、記憶體使用大小和程序啟動數。

App目錄都放在/workspace/carkey/ 目錄下

<code>root@localhost:</code><code>/workspace/carkey</code><code># ls</code>

<code>aaa                   AppCMDB            AppNOC  AppSSO   AppYunboWeb  get_app.sh</code>

<code>apache-tomcat-8.0.28  AppMerchantWebApi  AppPms  AppTest  bbb.py</code>

所有App開頭的目錄都是公司APP目錄,其他的不是。這些App都是JAVA程式,啟動後程序名可以通過

ps -ef | grep App_name 比對到,例如

[root@PMS001 ~]# ps -ef | grep AppPms

root       4698      1  0 Jul13 ?        00:00:28 /usr/java/latest/bin/java -Djava.util.logging.config.file=/workspace/carkey/AppPms/latest/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -XX:PermSize=256M -XX:MaxPermSize=1024m -Xms512M -Xmx1024M -XX:MaxNewSize=256m -Xms512M -Xmx1024M -server -XX:+UseParallelGC -Djava.endorsed.dirs=/usr/local/tomcat/endorsed -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/workspace/carkey/AppPms/latest -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/workspace/carkey/AppPms/latest/temp org.apache.catalina.startup.Bootstrap start

現需要對所有的App程序進行監控。是以,我們通過ls /workspace/carkey/  指令來擷取所有的程序名。并将程序名做成JSON格式:

以下是shell腳本内容:

17

18

19

20

21

22

23

24

<code>#!/bin/bash</code>

<code>export</code> <code>LANG=en_US.UTF-8</code>

<code>unset</code> <code>LC_ALL</code>

<code>a=(`</code><code>ls</code> <code>/workspace/carkey</code> <code>| </code><code>grep</code> <code>"^App"</code> <code>2&gt;</code><code>/dev/null</code><code>`)</code>

<code>b=()</code>

<code>for</code> <code>i </code><code>in</code> <code>${a[@]}; </code><code>do</code>

<code>        </code><code>if</code> <code>[ `</code><code>ls</code> <code>/workspace/carkey/</code><code>$i |</code><code>grep</code> <code>latest|</code><code>wc</code> <code>-l` -gt 0 ];</code><code>then</code>

<code>                </code><code>b=(</code><code>"${b[@]}"</code> <code>"$i"</code><code>)</code>

<code>        </code><code>fi</code>

<code>done</code>

<code>length=${</code><code>#b[@]}</code>

<code>printf</code> <code>"{\n"</code>

<code>printf</code>  <code>'\t'</code><code>"\"data\":["</code>

<code>for</code> <code>((i=0;i&lt;$length;i++))</code>

<code>do</code>

<code>    </code><code>printf</code> <code>'\n\t\t{'</code>

<code>    </code><code>printf</code> <code>"\"{#APP_NAME}\":\"${b[$i]}\"}"</code>

<code>    </code><code>if</code> <code>[ $i -lt $[$length-1] ];</code><code>then</code>

<code>        </code><code>printf</code> <code>','</code>

<code>    </code><code>fi</code>

<code>printf</code>  <code>"\n\t]\n"</code>

<code>printf</code> <code>"}\n"</code>

shell中主要是利用數組來實作的,這裡就整理下數組的基本知識。

1、數組的定義

<code>[root@PMS001 ~]</code><code># a=(1 2 3 4 5)</code>

<code>[root@PMS001 ~]</code><code># echo $a</code>

<code>1</code>

<code>[root@PMS001 ~]</code><code># echo ${a[*]}</code>

<code>1 2 3 4 5</code>

<code>[root@PMS001 ~]</code><code># echo ${a[@]}</code>

一對括号表示數組,數組元素用“空格”符号分隔開。檢視數組所有元素,用${a[*]}或者${a[@]}

2、通過下标檢視數組中的某個元素

<code>[root@PMS001 ~]</code><code># echo ${a[0]}</code>

<code>[root@PMS001 ~]</code><code># echo ${a[1]}</code>

<code>2</code>

<code>[root@PMS001 ~]</code><code># echo ${a[4]}</code>

<code>5</code>

<code>[root@PMS001 ~]</code><code># echo ${a[5]}</code>

數組是有序的,跟python中的清單和元組一樣,數組的下标從0開始。

3、擷取數組長度

<code>[root@PMS001 ~]</code><code># echo ${#a[@]}</code>

<code>[root@PMS001 ~]</code><code># echo ${#a[*]}</code>

4、數組指派

<code>[root@PMS001 ~]</code><code># a[1]=10</code>

<code>10</code>

<code>1 10 3 4 5</code>

數組是可以修改的,這一點和python中的清單一樣,但是python中的元組不可修改

5、删除

[root@PMS001 ~]# a=(1 2 3 4 5)

[root@PMS001 ~]# unset a

[root@PMS001 ~]# echo ${a[*]}

[root@PMS001 ~]# unset a[1]

[root@PMS001 ~]# echo ${a[*]} 

1 3 4 5

6、替換

[root@PMS001 ~]# a=(1 2 3 4 5)     

[root@PMS001 ~]# echo ${a[@]/3/10}

1 2 10 4 5

[root@PMS001 ~]# echo ${a[@]}

1 2 3 4 5

[root@PMS001 ~]# a=(${a[@]/3/10})

[root@PMS001

調用方法是:${數組名[@或*]/查找字元/替換字元} 該操作不會改變原先數組内容,如果需要修改,可以看上面例子,重新定義資料。

7、數組追加元素

<code>[root@PMS001 ~]</code><code># b=(${b[@]} 1)</code>

<code>[root@PMS001 ~]</code><code># echo ${b[@]}</code>

<code>[root@PMS001 ~]</code><code># b=(${b[@]} 2)</code>

<code>[root@PMS001 ~]</code><code># echo ${b[@]} </code>

<code>1 2</code>

<code>[root@PMS001 ~]</code><code># b=(${b[@]} 3)</code>

<code>1 2 3</code>

上面的shell腳本就是利用這個方法來重新生成一個數組,儲存符合條件的App_name

python腳本:

<code>#!/usr/bin/env python</code>

<code>import</code> <code>commands,json</code>

<code>app_str = commands.getoutput(</code><code>'ls /workspace/carkey/ |grep "^App"'</code><code>)</code>

<code>new_app_list = []</code>

<code>app_list = app_str.</code><code>split</code><code>(</code><code>'\n'</code><code>)</code>

<code>for</code> <code>I </code><code>in</code> <code>app_list:</code>

<code>    </code><code>com = </code><code>"ls /workspace/carkey/%s | grep latest"</code> <code>% I</code>

<code>    </code><code>commvalue=commands.getstatusoutput(com)</code>

<code>    </code><code>if</code> <code>commvalue[0] == 0:</code>

<code>        </code><code>new_app_list.append(I)</code>

<code>data={}</code>

<code>lis=[]</code>

<code>for</code> <code>App </code><code>in</code> <code>new_app_list:</code>

<code>    </code><code>dic={}</code>

<code>    </code><code>dic[</code><code>"{#APP_NAME}"</code><code>] = App</code>

<code>    </code><code>lis.append(dic)</code>

<code>data[</code><code>"data"</code><code>] = lis</code>

<code>print  json.dumps(data,sort_keys=True, indent=4)</code>

<code></code>

本文轉自 曾哥最愛 51CTO部落格,原文連結:http://blog.51cto.com/zengestudy/1826725,如需轉載請自行聯系原作者