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 script: (No lo escribí yo mismo, todos los créditos van a "Rich") ( http://www.notrainers.org/monitoring-memory-usage-on-linux-with-nagios- and-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, avíseme y trataré de proporcionarla lo más rápido posible.
Agradezco todas las entradas :)
${result%%.*}
sería la expansión correcta para eliminar el punto decimal aquí. Pero tenga en cuenta quecut -c -2
también causará problemas con números de 100 o más, por lo que es más seguro soltarlo por completo.Por el aspecto de las cosas, su
result
variable tiene un valor.
después del número que hace que bash no lo reconozca como tal. Puede reproducir el error simplemente haciendo:Si agrega más de la secuencia de comandos a su pregunta, | puedo sugerir de dónde podría provenir.
Actualizar
Mirando el guión completo, simplemente reemplazaría la línea:
Con:
Dado que
used
ytotal
son enteros ybash
aritmética de enteros, tenga en cuenta que el desplazamiento de la multiplicación sea 100 al principio. O si desea garantizar el redondeo correcto (la 'división entera' en informática siempre redondea de manera efectiva):Esto asegurará que no haya puntos finales
result
. El enfoque que utilizacut
no es una muy buena idea, ya que solo es válido para el resultado en el rango 10-99. Fallará por unresult
0-9 (como en su caso) y también números superiores a 99.Actualización 2
Según el comentario de @ Stephane a continuación , es mejor redondear hacia abajo cuando se compara con los umbrales. Considerando esto, hay otro pequeño error con el fragmento en la pregunta: observe la inconsistencia entre las comparaciones utilizadas para el
warn_level
y elcritical_level
. Las comparaciones parawarn_level
son correctas, perocritical_level
usan-le
(menor o igual) en lugar de-lt
(solo menor). Considere cuándoresult
es un poco más grande quecritical_level
: se redondeará hacia abajocritical_level
y no activará la advertencia crítica aunque debería (y lo haría si-lt
se usara comparación).Quizás no sea un gran problema, pero aquí está el código corregido:
Las
-ge
pruebas también son redundantes, ya que estos casos están implicados al llegar aelif
/else
, por lo que se han eliminado.fuente
result=$(( 100 * $used / $total ))
debería estar bien.Así que no sé cómo usarlo
awk
muy bien. Pero sí sé que lo que está sucediendo en el script que vinculó es una gran tontería y que algo como lo siguiente debería funcionar. Lo siento, no puedo escribir esto perfectamente bien, pero como ya estás llamandoawk
, al parecer dos veces, deberías estar usando algo como esto.fuente