2012-06-19 10 views
5

Redis: 2.0.4, 2.4.1, ...Redis: ¿quién está comiendo mi campo cuando los resultados de las tuberías llegan a través de awk?

Voy a escribir un plugin de Nagios para verificar la longitud de una lista. Aquí está mi script:

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

pero tengo el siguiente error cuando se ejecuta /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 

Funcionamiento en modo de depuración, he encontrado que el valor LLEN 's es ... en blanco. Desde los llen queue_1 devuelve el resultado correcto:

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

¿Por qué la tubería de tragar mis campos? (No sólo a awk sino también echo, tee, ...):

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

puedo comprobar el número de campos e imprimir el correspondiente como solución alternativa:

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

pero realmente quieren ¿Sabes por qué sucede? ¿Hay algún carácter nulo o especial entre (interger) y el número?

PD: parece que alguna otra versión de Redis (para e.x: 1.3.7) no obtiene este problema.

+0

que parece como si saber sobre la depuración de shell, ¿'configuró -vx', sí? De lo contrario, agréguela cerca de la parte superior de la secuencia de comandos para ver el seguimiento de ejecución Y los valores de las variables después de que se hayan evaluado. TAMBIÉN, puedes usar '| cat -vet' se agrega según sea necesario para ver algunos de los ctrl-chars que están incluidos en su pipeline (solo como un tmp aid para la depuración de trozos de código individuales, como se muestra al final de su pregunta). Un posible sospechoso, '^ M' el DOS '\ r' CR char. Buena suerte. – shellter

+0

Como dije anteriormente, veo que el valor de LLEN está en blanco cuando se ejecuta en modo de depuración. '| cat -vet' también devuelve solo el número. Estoy seguro de que no hay '^ M' en mi archivo (porque estaba escrito en la máquina Linux). Puede probar solo el comando 'redis-cli' en su propia máquina para ver qué sucede. – quanta

Respuesta

8

Lo que está experimentando es redis-cli seleccionando salidas diferentes dependiendo de lo que STDOUT es. Si STDOUT es un TTY, se emitirá redis-cli utilizando su formato "estándar". De lo contrario, el formato "crudo" es el valor por defecto:

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

Como puede ver en la ayuda, o de lo anterior, se puede especificar --raw tener siempre que muestre el formato "crudo" (sin calificadores de tipo, etc.) . Lo que descubrí al buscar en la fuente para esto, es que también hay un modo CSV, usando redis-cli --csv.

Editar: para forzar la salida "estándar", incluso cuando STDOUT no es un teléfono de texto, puede establecer la variable de entorno FAKETTY:

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

O

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

+1 por FAKETTY. – quanta

Cuestiones relacionadas