O erro é devido a um dos argumentos para -ge
não ser numérico. Como $ALERT
é sempre numérico, $usep
precisa ser o culpado. Existem vários problemas com a maneira como você analisa a saída de dh
, o que resulta em $usep
não sendo numérico.
Dependendo do tamanho dos sistemas de arquivos, dh
pode dividir sua saída em várias linhas. Linhas parciais serão capturadas em seu filtro e resultarão em dados sem sentido. Para evitar esse comportamento e obter resultados parassociais de dh
, passe a opção -P
.
Além disso, df
imprime uma linha de cabeçalho que, novamente, resultará em dados sem sentido.
Seu filtro é bastante complexo. Eu usaria uma única passagem de awk. Aliás, você poderia fazer a filtragem da porcentagem dentro do awk (mas eu não fiz isso no script a seguir).
df -H | awk '
NR == 1 {next}
$1 == "abc:/xyz/pqr" {next}
$1 == "tmpfs" {next}
$1 == "/dev/cdrom" {next}
1 {sub(/%/,"",$5); print $1, $5}
' | while read filesystem percentage; do
if [ "$percentage" -ge "$ALERT" ]; then
mail -s "Alert: Almost out of disk space ($usep%) on $filesystem" "$ADMIN"
fi
done
NR==1
corresponde à primeira linha, por isso NR==1 {next}
ignora a primeira linha. As próximas linhas excluem alguns sistemas de arquivos (note que sua descrição diz que você está interessado em abc:/xyz/pqr
, mas seu código exclui). A última linha do awk remove o %
da coluna de porcentagem antes de imprimi-lo.
Seria melhor enviar uma única mensagem sobre todos os sistemas de arquivos. Desta vez estou fazendo toda a análise no awk.
message=$(df -h | awk -v ALERT="$ALERT" '
NR == 1 {next}
$1 == "abc:/xyz/pqr" {next}
$1 == "tmpfs" {next}
$1 == "/dev/cdrom" {next}
1 {sub(/%/,"",$5)}
$5 >= ALERT {printf "%s is almost full: %d%%\n", $1, $5}
')
if [ -n "$message" ]; then
echo "$message" | mail -s "Alert: Almost out of disk space" "$ADMIN"
fi