O erro ocorre devido a um dos argumentos -ge
não ser numérico. Como $ALERT
é sempre numérico, $usep
deve ser o culpado. Existem vários problemas na maneira como você analisa a saída dh
cujo resultado é $usep
não ser numérico.
Dependendo dos comprimentos dos sistemas de arquivos, dh
pode dividir sua saída em várias linhas. Linhas parciais serão capturadas no seu filtro e resultarão em dados sem sentido. Para evitar esse comportamento e obter saída analisável dh
, passe a -P
opção
Também df
imprime uma linha de cabeçalho que novamente resultará em dados sem sentido.
Seu filtro é bastante complexo. Eu usaria uma única passagem do awk. Nesse caso, você poderia filtrar a 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, então NR==1 {next}
pula a primeira linha. As próximas linhas excluem alguns sistemas de arquivos (observe que sua descrição diz que você está interessado abc:/xyz/pqr
, mas seu código o exclui). A última linha awk remove a %
coluna da porcentagem antes de imprimi-la.
Seria melhor enviar um único e-mail sobre todos os sistemas de arquivos. Desta vez, estou fazendo todas as análises 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
Gilles 'SO- parar de ser mau'
fonte
aqui está minha variante:
fonte
Não consigo comentar a resposta de Gilles acima, mas esteja ciente de que o awk está fazendo uma comparação baseada em string na segunda parte, em que:
Percebi isso quando estava testando limites de um dígito. Você pode forçar uma conversão a int usando +0, para que a comparação se torne:
fonte