shell脚本实现LLD监控

要实现Zabbix LLD监控,通常需要两个脚本,一个自定义发现check脚本,并输出成Json格式,另一个才是获取监控项valus的脚本。

自定义发现checks脚本输出结果为以下形式:

{
    "data": [
        {
            "{#APP_NAME}": "AppCMDB"
        }, 
        {
            "{#APP_NAME}": "AppMerchantWebApi"
        }, 
        {
            "{#APP_NAME}": "AppNOC"
        }, 
        {
            "{#APP_NAME}": "AppSSO"
        }
    ]
}

用python写这样的脚本非常方便,那么如何用shell写呢?

先看一个实例:

公司需要生生产服务器的APP进程进行监控,监控项为CPU使用率、内存使用大小和进程启动数。

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

[email protected]:/workspace/carkey# ls
aaa                   AppCMDB            AppNOC  AppSSO   AppYunboWeb  get_app.sh
apache-tomcat-8.0.28  AppMerchantWebApi  AppPms  AppTest  bbb.py

所有App开头的目录都是公司APP目录,其他的不是。这些App都是JAVA程序,启动后进程名可以通过

ps -ef | grep App_name 匹配到,例如

[[email protected] ~]# 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格式:

{
    "data": [
        {
            "{#APP_NAME}": "AppCMDB"
        }, 
        {
            "{#APP_NAME}": "AppMerchantWebApi"
        }, 
        {
            "{#APP_NAME}": "AppNOC"
        }, 
        {
            "{#APP_NAME}": "AppSSO"
        }
    ]
}

以下是shell脚本内容:

#!/bin/bash
export LANG=en_US.UTF-8
unset LC_ALL
a=(`ls /workspace/carkey | grep "^App" 2>/dev/null`)
b=()
for i in ${a[@]}; do
        if [ `ls /workspace/carkey/$i |grep latest|wc -l` -gt 0 ];then
                b=("${b[@]}" "$i")
        fi
done

length=${#b[@]}
printf "{\n"
printf  ‘\t‘"\"data\":["
for ((i=0;i<$length;i++))
do
    printf ‘\n\t\t{‘
    printf "\"{#APP_NAME}\":\"${b[$i]}\"}"
    if [ $i -lt $[$length-1] ];then
        printf ‘,‘
    fi
done
printf  "\n\t]\n"
printf "}\n"

shell中主要是利用数组来实现的,这里就整理下数组的基本知识。

1、数组的定义

[[email protected] ~]# a=(1 2 3 4 5)
[[email protected] ~]# echo $a
1
[[email protected] ~]# echo ${a[*]}
1 2 3 4 5
[[email protected] ~]# echo ${a[@]}
1 2 3 4 5

一对括号表示数组,数组元素用“空格”符号分隔开。查看数组所有元素,用${a[*]}或者${a[@]}

2、通过下标查看数组中的某个元素

[[email protected] ~]# echo ${a[0]}
1
[[email protected] ~]# echo ${a[1]}
2
[[email protected] ~]# echo ${a[4]}
5
[[email protected] ~]# echo ${a[5]}

数组是有序的,跟python中的列表和元组一样,数组的下标从0开始。

3、获取数组长度

[[email protected] ~]# echo ${#a[@]}
5
[[email protected] ~]# echo ${#a[*]}
5

4、数组赋值

[[email protected] ~]# a[1]=10
[[email protected] ~]# echo ${a[1]}
10
[[email protected] ~]# echo ${a[*]}
1 10 3 4 5

数组是可以修改的,这一点和python中的列表一样,但是python中的元组不可修改

5、删除

[[email protected] ~]# a=(1 2 3 4 5)

[[email protected] ~]# unset a

[[email protected] ~]# echo ${a[*]}

[[email protected] ~]# a=(1 2 3 4 5)

[[email protected] ~]# unset a[1]

[[email protected] ~]# echo ${a[*]}

1 3 4 5

6、替换

[[email protected] ~]# a=(1 2 3 4 5)

[[email protected] ~]# echo ${a[@]/3/10}

1 2 10 4 5

[[email protected] ~]# echo ${a[@]}

1 2 3 4 5

[[email protected] ~]# a=(${a[@]/3/10})

[[email protected]

调用方法是:${数组名[@或*]/查找字符/替换字符} 该操作不会改变原先数组内容,如果需要修改,可以看上面例子,重新定义数据。

7、数组追加元素

[[email protected] ~]# b=(${b[@]} 1)
[[email protected] ~]# echo ${b[@]}
1
[[email protected] ~]# b=(${b[@]} 2)
[[email protected] ~]# echo ${b[@]} 
1 2
[[email protected] ~]# b=(${b[@]} 3)
[[email protected] ~]# echo ${b[@]} 
1 2 3

上面的shell脚本就是利用这个方法来重新生成一个数组,保存符合条件的App_name

python脚本:

#!/usr/bin/env python
import commands,json
app_str = commands.getoutput(‘ls /workspace/carkey/ |grep "^App"‘)
new_app_list = []
app_list = app_str.split(‘\n‘)
for I in app_list:
    com = "ls /workspace/carkey/%s | grep latest" % I
    commvalue=commands.getstatusoutput(com)
    if commvalue[0] == 0:
        new_app_list.append(I)
data={}
lis=[]
for App in new_app_list:
    dic={}
    dic["{#APP_NAME}"] = App
    lis.append(dic)
data["data"] = lis
print  json.dumps(data,sort_keys=True, indent=4)

参考资料:http://www.cnblogs.com/chengmo/archive/2010/09/30/1839632.html

时间: 2024-07-29 13:28:11

shell脚本实现LLD监控的相关文章

Linux基础之-利用shell脚本实现自动监控系统服务

目的:监控集群内nginx及nfs服务运行是否正常,如任一服务异常,则发送邮件通知用户 条件:1. 主机及子机IP地址,hostname已确定: 2. 主机与子机能够免密通讯,即基于密匙通讯(相关命令:ssh-keygen;ssh-copy-id -i web1); 需要的文件:    1. python邮件发送工具: 2. nfc.sh监控脚本,监控nginx及nfs服务状态,并调用mail发送工具通知用户: 3. nfc-install.sh监控部署脚本,运行在主机,为子机配置文件,执行命令

linux shell脚本守护进程监控svn服务

最近搭建的svn服务不知道什么原因服务总是被关闭(如果你不知道怎么搭建svn可以参考linux下搭建svn版本控制软件),因此用shell脚本实现一个守护进程.用于监控svn服务是否启动,如果服务不在则启动. 创建监控脚本svnmonit.sh #! /bin/sh #进程名字可修改 PRO_NAME=svnserve PORT=58652 REP_DIR=/www/svndata while true ; do #用ps获取$PRO_NAME进程数量 NUM=`ps aux | grep ${

zabbix中通过shell脚本进行微信监控告警

由于研究过php和java的微信告警发送,后来发现目前的微信告警需求相对不复杂,通过shell脚本可以满足目前的zabbix微信告警需求. 本文讲解的是通过shell脚本进行zabbix告警通过微信发送. 一.在zabbix的发送告警的的目录下新建sendWeChat.sh cd  /usr/lib/zabbix/alertscripts vim  sendWeChat.sh 二.脚本内容(需要企业号的CropID和Secret) #!/bin/bash # Filename:    sendW

shell脚本获取zabbix监控图

因为领导提出需要每天看几次服务器的流量图,今天早上9点上班开始截图,十多台服务器.指定时间12小时流量图,截完图反复对照好几遍,一是怕选错主机,二是怕搞错时间段.使用zabbix时间不长,一直感觉很别扭,容易出错.加上中间还做了一点其他东西的统计,最后等邮件发出的时候都已经是10点以后了. 这样下去,恐怕是影响仕途啊.若再加上有什么其他的事情,估计领导可以一边吃午饭一边看报表了,我只能选择吃土了... 网上教程比较多,python写的,perl写的,应为暂时没这方面基础,照搬过来运行报错就无解了

shell脚本——linux主机监控

写着玩儿的,在init 5级别,运行后会主动生成两个窗口,对系统以及系统上的主要服务进行监控,并及时刷新,抛砖引玉,分享一下. 一共有三个脚本:1个主脚本,2个分属监控脚本 主脚本启动: #!/bin/sh #writer:gaolixu path=`pwd` gnome-terminal --geometry=63x16 -e $path/jk1_xn.sh gnome-terminal --geometry=63x16+0+350 -e $path/jk2_fw.sh 系统监控脚本: #!/

shell脚本wget crul监控某网站是否正常

利用wget监控某网站是否正常 #!/bin/bash [ -f /etc/init.d/functions ] && . /etc/init.d/functions USAGE(){         echo "$0 URL"         exit 0 } check_web(){ wget --spider --timeout=100 --tries=2 $1 &>/dev/null if [ $? -ne 0 ]         then    

shell脚本,如何监控目录下的文件内容是否被修改。

第一种方法是通过cmp来进行比对[[email protected] bo]# ls 1.html 2.html 3.html 4.html 5.html 6.html 7.html 8.html 9.html cat.sh [[email protected] bo]# cat cat.sh #!/bin/bash [ ! -f /root/wyb/bo/cat.log ] && cat *.html > /root/wyb/bo/cat.log cat *.html >tm

shell脚本,如何监控mysql数据库。

[[email protected] wyb]# cat jkmysql #!/bin/bash status=`/etc/init.d/mysqld status|grep running|wc -l` process=`ps -ef |grep mysqld|grep -v grep|wc -l` port=`lsof -i:3306|grep -i listen|wc -l` mysql -uroot -p'test' -e "show databases;" >/dev/

Shell 脚本来自动监控 Linux 系统的内存

# vim /scripts/swap-warning.sh #!/bin/bash #提取本服务器的IP地址信息 IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "` #系统分配的交换分区总量 swap_total=`free -m | grep Swap | awk '{print $2}'` #当前剩余的交换分区free大小 swap_free=`