Linux Shell脚本之通过json判断应用程序内部运行状态

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介:

之前写过一篇《Zabbix监控之Linux命令行/Shell脚本解析json》,文章提到一种“利于Zabbix监控报警的json数据格式”,便于运维人员通过API获取应用程序中的运行状态、内部依赖关系等。但有的开发人员没有按照这种格式来,而是采用了下面的这种json数据格式:

成功:

1
2
3
4
{    
     "errcode" "0" ,    
         "errmsg" "ok"    
}

失败:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{    
     "errcode" "1" ,    
     "errmsg" : {    
         "Mysql" : {    
             "code" "0" ,    
             "msg" "OK"    
         },    
         "Memcache" : {    
             "code" "0" ,    
             "msg" "0"    
         },    
         "MQ" : {    
             "code" "0" ,    
             "msg" "OK"    
         },    
         "BS" : {    
             "code" "1" ,    
             "msg" "os与bs连接出现故障"    
         },    
         "Redis" : {    
             "code" "0" ,    
             "msg" "OK"    
         }    
     }    
}

而“利于Zabbix监控报警的json数据格式”应该是这样的:

成功:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{    
     "errcode" "0" ,    
         "errmsg" : {    
         "Mysql" : {    
             "code" "0" ,    
             "msg" "OK"    
         },    
         "Memcache" : {    
             "code" "0" ,    
             "msg" "0"    
         },    
         "MQ" : {    
             "code" "0" ,    
             "msg" "OK"    
         },    
         "BS" : {    
             "code" "0" ,    
             "msg" "ok"    
         },    
         "Redis" : {    
             "code" "0" ,    
             "msg" "OK"    
         }    
     }    
}

失败:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{    
     "errcode" "1" ,    
     "errmsg" : {    
         "Mysql" : {    
             "code" "0" ,    
             "msg" "OK"    
         },    
         "Memcache" : {    
             "code" "0" ,    
             "msg" "0"    
         },    
         "MQ" : {    
             "code" "0" ,    
             "msg" "OK"    
         },    
         "BS" : {    
             "code" "1" ,    
             "msg" "os与bs连接出现故障"    
         },    
         "Redis" : {    
             "code" "0" ,    
             "msg" "OK"    
         }    
     }    
}

由于今晚就要更新包含这段代码的应用,有可能来不及修改,因此我只能重新修改一下先前写好的脚本,现将脚本展示如下:

1
2
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
#!/bin/bash
 
# Shell Script Details
# Name:                                 getdata_gwservice.sh
# Version:                              1.0
# Visual Name(human readable format):   get data from Web Service(GWService)
# Shell Script Function:                get data from Web Service with curl, data format is json
# Author:                               Guodong Ding
# Date:                                 Thu Aug 20 09:56:26 CST 2015
 
# parameter is necessary
[ ! -z  "$1"  ] ||  exit  1
 
# resolve "jq" command for parse json
if  [[ ! ` which  jq` ]];  then
     echo  "jq is not installed on target system, please install it first! "
     # adaptive for CentOS or Ubuntu
     apt-get -qq -y  install  jq || yum -y  install  jq
     [ $? - ne  0 ] &&  echo  "Trying install jq failed! " ; echo  "Trying install jq successfully! "
     echo  "$(which jq) is found!"
     echo  1
fi
 
# refactoring curl CLI
curl=$( which  curl)
postdata= "accesscode=somecode&method=someapiname"
# test environment
url=http: //hostname/url/api
# production environment
#url=http://hostname/url/api
# TODO
# why not execute a string as command?
# curlcli="$curl -d \"$postdata\" $url 2>/dev/null"
 
# make repeated cli to a function
function  curlcli() {
     $curl -m 10 --connect-timeout 10 -s -d  "$postdata"  $url 2> /dev/null
     # For test purpose
     #echo '{"errcode":"1","errmsg":{"Mysql":{"code":"0","msg":"OK"},"Memcache":{"code":"0","msg":"0"},"MQ":{"code":"0","msg":"OK"},"BS":{"code":"1","errmsg":"os与bs连接出.故障"},"Redis":{"code":"0","errmsg":"OK"}}}'
     [ $? - ne  0 ] &&  exit  $?
 
}
 
# TODO
# How to merge function totalstatus() and function total_error_status() into a function?
function  totalstatus() {
     # another awk expression is: awk '{print int($1)}'
     curlcli | jq  ".errcode"  awk  -F  '"'  '/[0-9]/ {print $2}'
     [ $? - ne  0 ] &&  exit  $?
}
 
function  total_error_status() {
     outputswitch=`curlcli | jq  ".errcode"  awk  -F  '"'  '/[0-9]/ {print $2}' `
     if  [[ $outputswitch - eq  1 ]];  then
         curlcli | jq  ".errcode"  awk  -F  '"'  '/[0-9]/ {print $2}'  > /dev/null  2>&1
     else
         curlcli | jq  ".errcode"  awk  -F  '"'  '/[0-9]/ {print $2}'
     fi
     [ $? - ne  0 ] &&  exit  $?
     # TODO
     # why we need a return for this function ? because we will use "||" to determine result of CLI
     # by the way , "||" is depended on the result which returned with keyword "return"
     # tested pass with return a numeric argument lager than 1
     return  `curlcli | jq  ".errcode"  awk  -F  '"'  '/[0-9]/ {print $2}' `
}
 
function  mysqlstatus() {
     curlcli | jq  ".errmsg.Mysql.code"  awk  -F  '"'  '/[0-9]/ {print $2}'
     [ $? - ne  0 ] &&  exit  $?
}
 
function  memcachedstatus() {
     curlcli | jq  ".errmsg.Memcache.code"  awk  -F  '"'  '/[0-9]/ {print $2}'
     [ $? - ne  0 ] &&  exit  $?
}
 
function  messagequeuestatus() {
     curlcli | jq  ".errmsg.MQ.code"  awk  -F  '"'  '/[0-9]/ {print $2}'
     [ $? - ne  0 ] &&  exit  $?
}
 
function  businessservicestatus() {
     curlcli | jq  ".errmsg.BS.code"  awk  -F  '"'  '/[0-9]/ {print $2}'
     [ $? - ne  0 ] &&  exit  $?
}
 
function  redisstatus() {
     curlcli | jq  ".errmsg.Redis.code"  awk  -F  '"'  '/[0-9]/ {print $2}'
     [ $? - ne  0 ] &&  exit  $?
}
 
case  $1  in
     totalstatus )
         totalstatus
         ;;
     mysqlstatus )
         total_error_status || mysqlstatus
         ;;
     memcachedstatus )
         total_error_status || memcachedstatus
         ;;
     messagequeuestatus )
         total_error_status || messagequeuestatus
         ;;
     businessservicestatus )
         total_error_status || businessservicestatus
         ;;
     redisstatus )
         total_error_status || redisstatus
         ;;
esac

附:按照“利于Zabbix监控报警的json数据格式”写好的脚本展示如下:

1
2
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
#!/bin/bash
 
# Shell Script Details:
# Name:                                 getdata_gwservice.sh
# Version:                              2.0
# Visual Name(human readable format):   get data from Web Service(GWService) for Zabbix monitoring
# Shell Script Function:                get data from Web Service with curl, data format is json
# Author:                               Guodong Ding
# Date:                                 Thu Aug 20 09:56:26 CST 2015
 
# parameter is necessary
[ ! -z  "$1"  ] ||  exit  1
 
# resolve "jq" command for parse json
if  [[ ! ` which  jq` ]];  then
     echo  "jq is not installed on target system, please install it first! "
     # adaptive for CentOS or Ubuntu
     apt-get -qq -y  install  jq || yum -y  install  jq
     [ $? - ne  0 ] &&  echo  "Trying install jq failed! " ; echo  "Trying install jq successfully! "
     echo  "$(which jq) is found!"
     echo  1
fi
 
# refactoring curl CLI
curl=$( which  curl)
postdata= "accesscode=somecode&method=someapiname"
# test environment
url=http: //hostname/url/api
# production environment
#url=http://hostname/url/api
# TODO
# why not execute a string as command?
# curlcli="$curl -d \"$postdata\" $url 2>/dev/null"
 
# make repeated cli to a function
function  curlcli() {
     $curl -m 10 --connect-timeout 10 -s -d  "$postdata"  $url 2> /dev/null
     # For test purpose
     #echo '{"errcode":"1","errmsg":{"Mysql":{"code":"0","msg":"OK"},"Memcatch":{"code":"0","msg":"0"},"MQ":{"code":"0","msg":"OK"},"BS":{"code":"1","errmsg":"os与bs连接出.故障"},"Redis":{"code":"0","errmsg":"OK"}}}'
     [ $? - ne  0 ] &&  exit  $?
 
}
 
function  totalstatus() {
     # another awk expression is: awk '{print int($1)}'
     curlcli | jq  ".errcode"  awk  -F  '"'  '/[0-9]/ {print $2}'
     [ $? - ne  0 ] &&  exit  $?
     # TODO, TOREMEMBER
     # Why we need a return for this function? because we will use "||" to determine result of CLI, 
     # such as "totalstatus >/dev/null 2>&1 || mysqlstatus".
     # By the way , "||" is depended on the result which returned with keyword "return", 
     # tested pass with return a numeric argument lager than 1 , such as 1001, 9003, etc
     return  `curlcli | jq  ".errcode"  awk  -F  '"'  '/[0-9]/ {print $2}' `
}
 
function  mysqlstatus() {
     curlcli | jq  ".errmsg.Mysql.code"  awk  -F  '"'  '/[0-9]/ {print $2}'
     [ $? - ne  0 ] &&  exit  $?
}
 
function  memcachedstatus() {
     curlcli | jq  ".errmsg.Memcache.code"  awk  -F  '"'  '/[0-9]/ {print $2}'
     [ $? - ne  0 ] &&  exit  $?
}
 
function  messagequeuestatus() {
     curlcli | jq  ".errmsg.MQ.code"  awk  -F  '"'  '/[0-9]/ {print $2}'
     [ $? - ne  0 ] &&  exit  $?
}
 
function  businessservicestatus() {
     curlcli | jq  ".errmsg.BS.code"  awk  -F  '"'  '/[0-9]/ {print $2}'
     [ $? - ne  0 ] &&  exit  $?
}
 
function  redisstatus() {
     curlcli | jq  ".errmsg.Redis.code"  awk  -F  '"'  '/[0-9]/ {print $2}'
     [ $? - ne  0 ] &&  exit  $?
}
 
case  $1  in
     totalstatus )
         totalstatus
         ;;
     mysqlstatus )
         mysqlstatus
         ;;
     memcachedstatus )
         memcachedstatus
         ;;
     messagequeuestatus )
         messagequeuestatus
         ;;
     businessservicestatus )
         businessservicestatus
         ;;
     redisstatus )
         redisstatus
         ;;
     * )
         exit  1
         ;;
esac

tag:Linux命令行解析json,Linux Shell解析json,Zabbix业务监控,Zabbix自定义用户参数,Zabbix API

--end--


本文转自 urey_pp 51CTO博客,原文链接:http://blog.51cto.com/dgd2010/1686475,如需转载请自行联系原作者



相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
116 1
|
1月前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
69 2
6种方法打造出色的Shell脚本
|
1月前
|
缓存 Linux 开发者
Linux内核中的并发控制机制:深入理解与应用####
【10月更文挑战第21天】 本文旨在为读者提供一个全面的指南,探讨Linux操作系统中用于实现多线程和进程间同步的关键技术——并发控制机制。通过剖析互斥锁、自旋锁、读写锁等核心概念及其在实际场景中的应用,本文将帮助开发者更好地理解和运用这些工具来构建高效且稳定的应用程序。 ####
46 5
|
1月前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
65 1
|
2月前
|
机器学习/深度学习 人工智能 Ubuntu
|
1月前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
60 2
|
2月前
|
监控 网络协议 Shell
ip和ip网段攻击拦截系统-绿叶结界防火墙系统shell脚本
这是一个名为“小绿叶技术博客扫段攻击拦截系统”的Bash脚本,用于监控和拦截TCP攻击。通过抓取网络数据包监控可疑IP,并利用iptables和firewalld防火墙规则对这些IP进行拦截。同时,该系统能够查询数据库中的白名单,确保合法IP不受影响。此外,它还具备日志记录功能,以便于后续分析和审计。
62 6
|
1月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
1月前
|
存储 安全 关系型数据库
Linux系统在服务器领域的应用与优势###
本文深入探讨了Linux操作系统在服务器领域的广泛应用及其显著优势。通过分析其开源性、安全性、稳定性和高效性,揭示了为何Linux成为众多企业和开发者的首选服务器操作系统。文章还列举了Linux在服务器管理、性能优化和社区支持等方面的具体优势,为读者提供了全面而深入的理解。 ###
|
2月前
|
存储 数据可视化 Java
震惊!如何在linux下部署项目,部署/运行jar包 超详细保姆级教程!
如何在Linux系统下部署和运行Java项目jar包,包括传输文件到Linux、使用nohup命令运行jar包、查看端口状态、杀死进程和查看项目运行状态,以及如何解决“没有主清单属性”的错误。
664 1
震惊!如何在linux下部署项目,部署/运行jar包 超详细保姆级教程!

热门文章

最新文章