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