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 파이프라인이 예제에 나열되지 않은 다른 유형의 출력을 내보낼 수 있는 경우 파이프라인이나 이 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}
'