2012-06-19 18 views
5

Redis: 2.0.4, 2.4.1, ...Redis: ai đang ăn lĩnh vực của tôi khi đường ống dẫn đến kết quả llen thông qua awk?

Tôi sẽ viết một plugin Nagios để kiểm tra độ dài của danh sách. Đây là kịch bản của tôi:

#!/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 

nhưng tôi đã nhận lỗi sau khi chạy /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 

Chạy nó trong chế độ gỡ lỗi, tôi thấy rằng giá trị của LLEN là ... trống. Kể từ khi số llen queue_1 trả về kết quả phù hợp:

# /usr/local/redis/bin/redis-cli -h 192.168.5.201 -p 2468 llen queue_1 
(integer) 965 

tại sao ống dẫn nuốt trường của tôi? (Không chỉ để awk mà còn echo, tee, ...):

# /usr/local/redis/bin/redis-cli -h 192.168.5.201 -p 2468 llen queue_1 | \ 
awk '{ print $0 }' 
961 

tôi có thể kiểm tra số lĩnh vực và in tương ứng như một cách giải quyết:

| awk '{ if (NF == 2) print $2; else print $1 }'` 

nhưng tôi thực sự muốn biết tại sao nó xảy ra? Có bất kỳ ký tự rỗng hoặc đặc biệt nào giữa số (interger) và số không?

PS: có vẻ như một số phiên bản Redis khác (đối với e.x: 1.3.7) không gặp phải vấn đề này.

+0

bạn có vẻ như bạn biết về trình gỡ lỗi shell, bạn có 'đặt -vx' không? Nếu không, hãy thêm gần đầu tập lệnh để xem dấu vết thực thi VÀ giá trị của các biến sau khi chúng được đánh giá. CSONG, bạn có thể sử dụng '| cat -vet' được thêm vào khi cần để xem một số ký tự ctrl được bao gồm trong đường ống của bạn (chỉ như một trợ giúp tmp để gỡ lỗi các mã riêng lẻ, khi bạn hiển thị gần cuối câu hỏi của mình). Có thể nghi ngờ, '^ M' DOS '\ r' CR char. Chúc may mắn. – shellter

+0

Như tôi đã nói ở trên, tôi thấy giá trị của LLEN trống khi chạy trong chế độ gỡ lỗi. '| cat -vet' cũng chỉ trả về số. Tôi chắc chắn không có '^ M' trong tệp của tôi (vì nó được viết trên máy Linux). Bạn chỉ có thể kiểm tra lệnh 'redis-cli' trên máy của mình để xem điều gì đang xảy ra. – quanta

Trả lời

8

Điều bạn đang gặp phải là redis-cli chọn các kết quả đầu ra khác nhau tùy thuộc vào những gì STDOUT là. Nếu STDOUT là TTY, redis-cli sẽ xuất ra bằng định dạng "chuẩn". Nếu không, "thô" định dạng là mặc định:

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

Như bạn thấy từ sự giúp đỡ, hoặc ở trên, bạn có thể chỉ định --raw luôn luôn có nó đầu ra định dạng "thô" (không có vòng loại, vv) . Những gì tôi phát hiện ra thông qua nguồn cho điều này, đó là cũng có một chế độ CSV, sử dụng redis-cli --csv.

Edit: Để buộc các "tiêu chuẩn" đầu ra, ngay cả khi STDOUT không phải là một TTY, bạn có thể thiết lập các biến môi trường FAKETTY:

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

Hoặc

redis-cli --raw llen some_list | awk '{ print $1 }' 
+0

+1 cho FAKETTY. – quanta

Các vấn đề liên quan