Ho un problema piuttosto strano, sto eseguendo uno script (Bash) su più server e ha smesso di funzionare su uno dei server (funziona perfettamente su tutti gli altri server).
Ecco la parte problematica della sceneggiatura:(Non l'ho scritta io stesso, tutti i crediti vanno a "Ricco") (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
Messaggio di errore 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
Se hai bisogno di maggiori informazioni, fammi sapere e cercherò di fornirle il più velocemente possibile.
Apprezza tutti gli input 🙂
Risposta accettata:
Dal link che hai fornito, vedo la riga sottostante.
result=$(echo "$used / $total * 100" |bc -l|cut -c -2)
Come per il commento di @Graeme, cambia la riga sopra in sotto.
result=$(echo "$used / $total * 100" |bc -l)
Ora, dopo aver aggiunto la riga sopra, dobbiamo cambiare l'output del result
per intero come di seguito.
result1=${result/.*}
Immagino che in una delle macchine in cui si verifica l'errore, questo output non è un numero intero. Basta convertire l'output del risultato in intero in modo da poter gestire questi casi. Aggiungi la riga sottostante dopo aver calcolato il result
.
result1=${result/.*}
E invece di result
cambia i nomi delle variabili come result1
all'interno del if
loop e l'errore non si verificherà.
Sospetto, il cut -c -2
attribuisce all'errore principalmente poiché sta tagliando solo i primi 2 caratteri. E se il risultato avesse un solo carattere? Supponiamo che il risultato sia 1.23456
, il taglio sopra risulterà in 1.
come valore per result
che ovviamente è la causa del integer expected
errore.
Il motivo per cui funziona correttamente nei server rimanenti è perché non ha riscontrato un caso in cui il result
la variabile ha solo una cifra. È molto probabile che fallisca anche nei server rimanenti se il risultato è una variabile a una cifra (qualcosa come ho menzionato nell'esempio sopra).