2012-06-19 18 views
5

रेडिस: 2.0.4, 2.4.1, ...रेडिस: लोहे को पाइप करते समय मेरे क्षेत्र को कौन खा रहा है?

मैं एक सूची की लंबाई की जांच करने के लिए एक नागियो प्लगइन लिखने जा रहा हूं। यहाँ मेरी स्क्रिप्ट है:

#!/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 के मूल्य ... खाली है।

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

क्यों पाइपलाइन मेरी क्षेत्रों निगल करता है: llen queue_1 रिटर्न सही परिणाम के बाद से? (न केवल करने के लिए 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) और संख्या के बीच कोई शून्य या विशेष चरित्र है?

पीएस: ऐसा लगता है कि कुछ अन्य रेडिस संस्करण (ई.एक्स: 1.3.7 के लिए) को यह समस्या नहीं मिलती है।

+0

आप आप की तरह लग खोल डिबगिंग के बारे में जानें, क्या आपने 'सेट -vx' सेट किया था, हां? यदि नहीं, तो मूल्यांकन के बाद निष्पादन ट्रेस और चर के मान देखने के लिए उस स्क्रिप्ट के शीर्ष को जोड़ें। भी, आप '| का उपयोग कर सकते हैं बिल्ली-स्वेच्छा 'को आपके पाइपलाइन में शामिल कुछ ctrl-chars को देखने के लिए जरूरी है (केवल कोड के अलग-अलग हिस्सों को डीबग करने के लिए एक टीएमपी सहायता के रूप में, जैसा कि आप अपने प्रश्न के निचले हिस्से में दिखाते हैं)। एक संभावित संदिग्ध, '^ एम 'डीओएस' \ आर' सीआर चार। सौभाग्य। – shellter

+0

जैसा कि मैंने उपरोक्त कहा है, मुझे लगता है कि डीबग मोड में चलते समय LLEN का मान खाली है। '| बिल्ली-स्वेत 'केवल संख्या ही देता है। मुझे यकीन है कि मेरी फाइल में कोई^^ एम' नहीं है (क्योंकि यह लिनक्स मशीन पर लिखा गया था)। क्या होता है यह देखने के लिए आप अपनी मशीन पर केवल 'रेडिस-क्ली' कमांड का परीक्षण कर सकते हैं। FAKETTY के लिए – quanta

उत्तर

8

आप जो अनुभव कर रहे हैं वह STDOUT के आधार पर विभिन्न आउटपुट का चयन कर रहा है। यदि STDOUT एक TTY है, redis-cli इसके "मानक" स्वरूपण का उपयोग करके आउटपुट करेगा। अन्यथा, "कच्चे" स्वरूपण डिफ़ॉल्ट है:

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

यदि आपको मदद की, या ऊपर से देखने के रूप में, आप --raw हमेशा के लिए निर्दिष्ट कर सकते हैं यह उत्पादन "कच्चे" प्रारूप (प्रकार क्वालिफायर, आदि के बिना) । इसके लिए मुझे स्रोत के माध्यम से खोदने का पता चला, यह है कि 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 }' 
+0

+1। – quanta