我面临为 redis 服务器编写脚本的问题。我知道这将是非常正常的脚本,但由于我缺乏知识,我无法做到。
目前我可以在使用以下命令时退出
redis-cli -r -1 -i 300 INFO | grep slave
connected_slaves:4
slave0:ip=70.0.0.170,port=7000,state=online,offset=2425867354,lag=1
slave1:ip=70.0.0.227,port=7000,state=online,offset=2425870831,lag=0
slave2:ip=70.0.0.228,port=7000,state=online,offset=2425871141,lag=0
slave3:ip=70.0.0.171,port=7000,state=online,offset=2428745984,lag=1
我想要一个监控脚本,如果任何从站不处于在线状态或滞后超过5,它将发送电子邮件。
答案1
这是一个awk
程序(在 bash 脚本中),它解析命令的输出并检测其中存在问题的行。我的awk
已经生锈了,所以无疑不优雅,但很管用。
它采用标准输入并仅打印符合您要查找的条件的行。
我在注释掉之后留下了我用来调试它的打印语句。
为了避免仅为程序使用单独的临时或永久文件awk
,整个文件都添加到awk
命令行上,并用单引号引起来,使其成为一个参数并防止 bash 扩展它。
要使用它,您可以将其添加到当前管道的末尾,例如
redis-cli -r -1 -i 300 INFO | grep slave | parse_redis > some-file
如果some-file
不为空,则通过电子邮件发送给自己。
awk 代码非常简单,可以轻松修改它以满足您的需要。
我没有介绍如何从 cron 等运行它。如果您需要集成它的帮助,请为此答案添加评论。
如果redis
/your pipeline 可以发出示例中未列出的其他类型的输出,那么您必须修改您的管道或此awk
程序来处理它们。
#!/bin/bash
## parse_redis
## parses redis output looking for state and lag problems
## sets awk's field separator to a comma to make things easy
## whole awk program is a single single-quoted string on the awk command line
awk -F ',' '
BEGIN {
max_lag = 5 ## threshold for acceptable lag times
}
##{ print "input is " NR " " $0 }
NR == 1 {next} ## skip first line of input
problem=0 ## flag for problem detected
## detect anything except online
##{ print "field 3 [" $3 "]" }
## If the third field does not contain state=online, then it is a problem
$3 !~ "state=online" {problem = 1}
## Get the value for lag and see if it is too large
## lag is in the 5th field starting at the 5th character
## extract the value from the 5th character to the end
## of the field and turn it into a number
## Probably would work without turning it into a number
{
##{ print "field 5 [" $5 "]" }
lag = strtonum(substr($5, 5))
##{ print "lag [" lag "]" }
if (lag > max_lag) problem = 1
}
##{ print "problem [" problem "]" }
{if (problem == 0) next}
{print}
'