Estou com um problema bastante estranho, estou executando um script (Bash) em vários servidores e ele parou de funcionar em um dos servidores (funciona perfeitamente em todos os outros servidores).
Aqui está a parte problemática do script: (eu não o escrevi, todos os créditos vão para "Rich") ( http://www.notrainers.org/monitoring-memory-usage-on-linux-with-nagios- e-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
Mensagem de erro completa:
./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
Se precisar de mais informações, entre em contato e tentarei fornecê-las o mais rápido possível.
Aprecie todas as entradas :)
${result%%.*}
seria a expansão correta para remover o ponto decimal aqui. Mas observe quecut -c -2
isso também causará problemas com números de 100 ou mais; portanto, é mais seguro descartá-lo completamente.Pela aparência, sua
result
variável possui um.
após o número que faz o bash não o reconhecer como tal. Você pode reproduzir o erro simplesmente fazendo:Se você adicionar mais do script à sua pergunta, | eu posso sugerir de onde isso pode estar vindo.
Atualizar
Olhando para o script completo, eu apenas substituiria a linha:
Com:
Como
used
etotal
são inteiros ebash
aritméticos inteiros, observe que o deslocamento da multiplicação é 100 para o início. Ou, se você deseja garantir o arredondamento correto ('divisão inteira' na computação sempre efetivamente arredonda para baixo):Isso garantirá que não haja pontos à direita
result
. A abordagem utilizadacut
não é uma ideia muito boa, pois é válida apenas para resultados no intervalo de 10 a 99. Ele falharáresult
entre 0 e 9 (como no seu caso) e também números acima de 99.Atualização 2
No comentário de @ Stephane abaixo , é melhor arredondar para baixo ao comparar com os limites. Considerando isso, há outro pequeno erro com o trecho na pergunta - observe a inconsistência entre as comparações usadas para
warn_level
oe ocritical_level
. As comparações parawarn_level
estão corretas, mascritical_level
usam-le
(menor ou igual) em vez de-lt
(apenas menor). Considere quandoresult
é um pouco maior quecritical_level
- será arredondado para baixocritical_level
e não acionará o aviso crítico, mesmo que deva (e faria se uma-lt
comparação fosse usada).Talvez não seja um problema muito grande, mas aqui está o código corrigido:
Os
-ge
testes também são redundantes, pois esses casos estão implícitos em atingir oelif
/else
, por isso foram removidos.fonte
result=$(( 100 * $used / $total ))
, tudo bem.Então, eu não sei usar
awk
muito bem. Mas eu sei que o que está acontecendo no script que você vinculou é muito absurdo e que algo como o seguinte deve funcionar. Sinto muito, mas não posso escrever isso perfeitamente, mas como você já está ligandoawk
- parece que duas vezes -, você deve usar algo assim.fonte