5

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バージョン(例:1.3.7)ではこの問題が発生しないようです。

4

1 に答える 1

8

あなたが経験しているのはredis-cli、内容に応じて異なる出力を選択することSTDOUTです。STDOUTが TTY の場合、redis-cliその「標準」フォーマットを使用して出力します。それ以外の場合は、「生の」フォーマットがデフォルトです。

--raw            Use raw formatting for replies (default when STDOUT is not a tty)

ヘルプまたは上記からわかるように、--raw常に「生の」形式(型修飾子などなし)を出力するように指定できます。このソースを掘り下げて分かったのは、を使用した CSV モードもあるということですredis-cli --csv

編集:「標準」出力を強制するにSTDOUTは、TTY ではない場合でも、環境変数を設定できますFAKETTY

FAKETTY=1 redis-cli llen some_list | awk '{ print $2 }'

または

redis-cli --raw llen some_list | awk '{ print $1 }'
于 2012-06-19T12:06:40.810 に答える