要實作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></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<$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,如需轉載請自行聯系原作者