Redis:2.0.4,2.4.1,......
我打算写一个Nagios插件来检查列表的长度。这是我的剧本:
#!/bin/sh
help()
{
echo "Usage: $0 <host> <port> <key> -w <warning> -c <critical>"
}
case "$1" in
--help)
help
exit
;;
esac
if [ $# -eq 0 ]; then
help
exit 3
fi
if [ $# -ne "7" ]; then
help
exit 4
fi
if [ $4 !="-w" -o $6 !="-c" ]; then
help
exit 5
fi
REDIS_CLI="/usr/local/redis/bin/redis-cli"
LLEN=`$REDIS_CLI -h $1 -p $2 llen $3 | awk '{ print $2 }'`
if [ $LLEN -lt $5 ]; then
echo "$3.llen:$2 OK - $LLEN | $3.llen:$2=$LLEN;$5;$7"
exit 0
elif [ $LLEN -ge $5 -a $LLEN -lt $7 ]; then
echo "$3.llen:$2 WARNING - $LLEN | $3.llen:$2=$LLEN;$5;$7"
exit 1
elif [ $LLEN -ge "$7" ]; then
echo "$3.llen:$2 CRITICAL - $LLEN | $3.llen:$2=$LLEN;$5;$7"
exit 2
fi
但运行/usr/lib64/nagios/plugins/redis_llen.sh 192.168.5.201 2468 -w 90000 -c 100000
时出现以下错误:
/usr/lib64/nagios/plugins/redis_llen.sh: line 31: [: -lt: unary operator expected
/usr/lib64/nagios/plugins/redis_llen.sh: line 34: [: too many arguments
/usr/lib64/nagios/plugins/redis_llen.sh: line 37: [: -ge: unary operator expected
在调试模式下运行它,我发现LLEN
的值是......空白。由于llen queue_1
返回正确的结果:
# /usr/local/redis/bin/redis-cli -h 192.168.5.201 -p 2468 llen queue_1
(integer) 965
为什么管道吞下我的田地? (不仅是awk
,还有echo
,tee
,......):
# /usr/local/redis/bin/redis-cli -h 192.168.5.201 -p 2468 llen queue_1 | \
awk '{ print $0 }'
961
我可以检查字段数并打印相应的解决方法:
| awk '{ if (NF == 2) print $2; else print $1 }'`
但我真的想知道它为什么会发生? (interger)
和数字之间是否有空格或特殊字符?
PS:似乎其他一些Redis版本(适用于e.x:1.3.7)没有出现此问题。
答案 0 :(得分:8)
您遇到的问题是redis-cli
根据STDOUT
选择不同的输出。如果STDOUT
是TTY,则redis-cli
将使用它输出&#34;标准&#34;格式。否则,&#34; raw&#34;格式是默认值:
--raw Use raw formatting for replies (default when STDOUT is not a tty)
从帮助或上面的内容中可以看出,您可以指定--raw
始终输出&#34; raw&#34;格式(没有类型限定符等)。我发现从源头挖掘的是,使用redis-cli --csv
还有一种CSV模式。
编辑:强制执行&#34;标准&#34;输出,即使STDOUT
不是TTY,您也可以设置环境变量FAKETTY
:
FAKETTY=1 redis-cli llen some_list | awk '{ print $2 }'
或者
redis-cli --raw llen some_list | awk '{ print $1 }'