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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介:

之前写过一篇《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
相关文章
|
5天前
|
Shell Linux
【linux】Shell脚本中basename和dirname的详细用法教程
本文详细介绍了Linux Shell脚本中 `basename`和 `dirname`命令的用法,包括去除路径信息、去除后缀、批量处理文件名和路径等。同时,通过文件备份和日志文件分离的实践应用,展示了这两个命令在实际脚本中的应用场景。希望本文能帮助您更好地理解和应用 `basename`和 `dirname`命令,提高Shell脚本编写的效率和灵活性。
60 32
|
4月前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
150 1
|
2月前
|
Ubuntu Linux Go
golang编译成Linux可运行文件
本文介绍了如何在 Linux 上编译和运行 Golang 程序,涵盖了本地编译和交叉编译的步骤。通过这些步骤,您可以轻松地将 Golang 程序编译成适合 Linux 平台的可执行文件,并在目标服务器上运行。掌握这些技巧,可以提高开发和部署 Golang 应用的效率。
278 14
|
3月前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
104 2
6种方法打造出色的Shell脚本
|
3月前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
127 1
|
4月前
|
机器学习/深度学习 人工智能 Ubuntu
|
3月前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
129 2
|
4月前
|
监控 网络协议 Shell
ip和ip网段攻击拦截系统-绿叶结界防火墙系统shell脚本
这是一个名为“小绿叶技术博客扫段攻击拦截系统”的Bash脚本,用于监控和拦截TCP攻击。通过抓取网络数据包监控可疑IP,并利用iptables和firewalld防火墙规则对这些IP进行拦截。同时,该系统能够查询数据库中的白名单,确保合法IP不受影响。此外,它还具备日志记录功能,以便于后续分析和审计。
84 6
|
3月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
1月前
|
JSON 前端开发 搜索推荐
关于商品详情 API 接口 JSON 格式返回数据解析的示例
本文介绍商品详情API接口返回的JSON数据解析。最外层为`product`对象,包含商品基本信息(如id、name、price)、分类信息(category)、图片(images)、属性(attributes)、用户评价(reviews)、库存(stock)和卖家信息(seller)。每个字段详细描述了商品的不同方面,帮助开发者准确提取和展示数据。具体结构和字段含义需结合实际业务需求和API文档理解。