Tengo un problema bastante extraño, estoy ejecutando un script (Bash) en varios servidores y dejó de funcionar en uno de los servidores (funciona perfectamente bien en todos los demás servidores).
Aquí está la parte problemática del guión:(No lo escribí yo mismo, todos los créditos van a “Rich”) (http://www.notrainers.org/monitoring-memory-usage-on-linux-with-nagios- y-nrpe/)
if [ "$result" -lt "$warn_level" ]; then #Line 56
echo "Memory OK. $result% used."
exit 0;
elif [ "$result" -ge "$warn_level" ] && [ "$result" -le "$critical_level" ]; then #Line 59
echo "Memory WARNING. $result% used."
exit 1;
elif [ "$result" -gt "$critical_level" ]; then #Line 62
echo "Memory CRITICAL. $result% used."
exit 2;
fi
Mensaje de error completo:
./check_memory.sh: Line 56: [: 7.: integer expression expected
./check_memory.sh: Line 59: [: 7.: integer expression expected
./check_memory.sh: Line 62: [: 7.: integer expression expected
Si necesita más información, hágamelo saber e intentaré proporcionársela lo más rápido posible.
Agradezco todas las entradas 🙂
Respuesta aceptada:
Desde el enlace que proporcionó, veo la siguiente línea.
result=$(echo "$used / $total * 100" |bc -l|cut -c -2)
Según el comentario de @Graeme, cambie la línea de arriba a la de abajo.
result=$(echo "$used / $total * 100" |bc -l)
Ahora, después de agregar la línea anterior, tenemos que cambiar la salida del result
a entero como se muestra a continuación.
result1=${result/.*}
Supongo que en una de las máquinas donde ocurre el error, esta salida no es un número entero. Simplemente convierta la salida del resultado a un número entero para que pueda manejar tales casos. Agregue la siguiente línea después de calcular el result
.
result1=${result/.*}
Y en lugar de result
cambie los nombres de las variables como result1
dentro del if
bucles, y el error no ocurrirá.
Sospecho que el cut -c -2
se atribuye al error principalmente porque está cortando solo los primeros 2 caracteres. ¿Qué sucede si el resultado tiene un solo carácter? Supongamos que si el resultado es 1.23456
, el corte anterior dará como resultado 1.
como valor para result
que obviamente es la causa del integer expected
error.
La razón por la que funciona bien en los servidores restantes es porque no ha encontrado un caso en el que el result
variable tiene un solo dígito. Es muy probable que también falle en los servidores restantes si el resultado es una variable de un solo dígito (algo como lo que mencioné en el ejemplo anterior).