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.
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
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