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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介:
原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 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
目录
相关文章
|
3月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
1月前
|
存储 Shell Linux
Linux 如何更改默认 Shell
Linux 如何更改默认 Shell
36 0
Linux 如何更改默认 Shell
|
1月前
|
缓存 Linux 开发者
Linux内核中的并发控制机制:深入理解与应用####
【10月更文挑战第21天】 本文旨在为读者提供一个全面的指南,探讨Linux操作系统中用于实现多线程和进程间同步的关键技术——并发控制机制。通过剖析互斥锁、自旋锁、读写锁等核心概念及其在实际场景中的应用,本文将帮助开发者更好地理解和运用这些工具来构建高效且稳定的应用程序。 ####
46 5
|
2月前
|
Web App开发 网络协议 Linux
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
这篇文章是关于Linux命令的总结,涵盖了从基础操作到网络配置等多个方面的命令及其使用方法。
80 1
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
|
1月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
1月前
|
存储 安全 关系型数据库
Linux系统在服务器领域的应用与优势###
本文深入探讨了Linux操作系统在服务器领域的广泛应用及其显著优势。通过分析其开源性、安全性、稳定性和高效性,揭示了为何Linux成为众多企业和开发者的首选服务器操作系统。文章还列举了Linux在服务器管理、性能优化和社区支持等方面的具体优势,为读者提供了全面而深入的理解。 ###
|
3月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
3月前
|
人工智能 监控 Shell
常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)
这篇文章提供了55个常用的Linux Shell脚本实例,涵盖基础案例、文件操作、实用工具、图形化界面及sed、gawk的使用。
782 2
|
2月前
|
存储 Shell Linux
【Linux】shell基础,shell脚本
Shell脚本是Linux系统管理和自动化任务的重要工具,掌握其基础及进阶用法能显著提升工作效率。从简单的命令序列到复杂的逻辑控制和功能封装,Shell脚本展现了强大的灵活性和实用性。不断实践和探索,将使您更加熟练地运用Shell脚本解决各种实际问题
37 0
|
3月前
|
Shell Linux 开发工具
linux shell 脚本调试技巧
【9月更文挑战第3天】在Linux中调试shell脚本可采用多种技巧:使用`-x`选项显示每行命令及变量扩展情况;通过`read`或`trap`设置断点;利用`echo`检查变量值,`set`显示所有变量;检查退出状态码 `$?` 进行错误处理;使用`bashdb`等调试工具实现更复杂调试功能。