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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:
原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 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

目录
相关文章
|
26天前
|
安全 Linux iOS开发
Nessus Professional 10.10 Auto Installer for RHEL 10, AlmaLinux 10, Rocky Linux 10 - Nessus 自动化安装程序
Nessus Professional 10.10 Auto Installer for RHEL 10, AlmaLinux 10, Rocky Linux 10 - Nessus 自动化安装程序
116 6
Nessus Professional 10.10 Auto Installer for RHEL 10, AlmaLinux 10, Rocky Linux 10 - Nessus 自动化安装程序
|
2月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
385 9
|
2月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
253 2
|
2月前
|
算法 Linux Shell
Linux实用技能:打包压缩、热键、Shell与权限管理
本文详解Linux打包压缩技巧、常用命令与原理,涵盖.zip与.tgz格式操作、跨系统传文件方法、Shell运行机制及权限管理,助你高效使用Linux系统。
Linux实用技能:打包压缩、热键、Shell与权限管理
|
4月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
460 1
|
监控 Linux
linux服务器显卡监控脚本
linux服务器显卡监控脚本
259 0
|
监控 Shell Linux
Linux 性能监控之CPU&内存&I/O监控Shell脚本1
Linux 性能监控之CPU&内存&I/O监控Shell脚本1
367 0