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

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:
原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 http://dgd2010.blog.51cto.com/1539422/1686475

之前写过一篇《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--

本文出自 “通信,我的最爱” 博客,请务必保留此出处http://dgd2010.blog.51cto.com/1539422/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
目录
相关文章
|
4天前
|
Linux 开发工具 C语言
Linux 安装 gcc 编译运行 C程序
Linux 安装 gcc 编译运行 C程序
22 0
|
17天前
|
监控 Unix Linux
Linux操作系统调优相关工具(四)查看Network运行状态 和系统整体运行状态
Linux操作系统调优相关工具(四)查看Network运行状态 和系统整体运行状态
31 0
|
18天前
|
Web App开发 Java Linux
Linux之Shell基本命令篇
Linux之Shell基本命令篇
Linux之Shell基本命令篇
|
25天前
|
Linux Shell
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
Linux手动清理Linux脚本日志定时清理日志和log文件执行表达式
78 1
|
28天前
|
Linux Shell Python
Linux执行Python脚本
Linux执行Python脚本
27 1
|
1月前
|
监控 Shell Linux
【Shell 命令集合 系统管理 】Linux 显示当前登录到系统的用户信息 who命令 使用指南
【Shell 命令集合 系统管理 】Linux 显示当前登录到系统的用户信息 who命令 使用指南
43 1
|
17天前
|
Linux
Linux操作系统调优相关工具(三)查看IO运行状态相关工具 查看哪个磁盘或分区最繁忙?
Linux操作系统调优相关工具(三)查看IO运行状态相关工具 查看哪个磁盘或分区最繁忙?
21 0
|
3天前
|
Java Shell Linux
【linux进程控制(三)】进程程序替换--如何自己实现一个bash解释器?
【linux进程控制(三)】进程程序替换--如何自己实现一个bash解释器?
|
4天前
|
Linux Shell Android开发
自动化脚本之GPIO/LED相关适用于Android/Linux
自动化脚本之GPIO/LED相关适用于Android/Linux
13 0
|
16天前
|
存储 Shell Linux
【攻防世界】unseping (反序列化与Linux bash shell)
【攻防世界】unseping (反序列化与Linux bash shell)