Script de shell para enviar um email de alerta se o uso do disco exceder 90%

9

Eu quero implementar um script no meu servidor que enviará automaticamente alertas de email se o uso do disco ultrapassar 90% e o segundo email alertar quando passar de 95%. Meu sistema de arquivos é abc:/xyz/abc e o ponto de montagem é /pqr .

Eu tentei isso:

ADMIN="[email protected]" 
ALERT=90 
df -H | grep -vE 'abc:/xyz/pqr | tmpfs |cdrom' | awk '{ print $5 " " $1 }' | while read output; do 
  usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 ) 
  partition=$(echo $output | awk '{ print $2 }' ) 
    if [ $usep -ge $ALERT ]; then 
      mail -s "Alert: Almost out of disk space $usep" $ADMIN 
    fi 
  done

Mas estou recebendo um erro que diz

line 7: [: Use: integer expression expected 
    
por Rui F Ribeiro 24.07.2013 / 15:03

5 respostas

12

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 
    
por 25.07.2013 / 04:30
6

Se você alterar imprimir para printf usando% d, a porcentagem se tornará um número inteiro. Experimente:

printf("%d", $5);

que converterá 91% para 91. Assim, o comando final é este:

df -H | grep /dev/xvde1 | awk '{ printf "%d", $5}'

O comando acima em inglês: "Obtém o uso do espaço em disco em formato legível por humanos. Filtre com grep no disco que queremos ver. Faça o pipe dessa linha para awk e imprima a quinta palavra delimitado pelo espaço (esvaziados removidos) e formatar a string resultante como um inteiro.Para mim, o comando retorna o inteiro 78 , o que significa que o disco está 78% cheio.

    
por 10.06.2014 / 15:13
1
$ df | tail +2 | sed s/%//g | awk '{ if($5 > 90) print "Alert "$0;}'
  • df | tail +2 pega toda a saída depois de pular as duas primeiras linhas
  • sed s/%//g retira sinais de porcentagem
  • awk ... imprime "Alerta ..." se o quinto campo na saída for um número maior que 90
por 16.05.2015 / 09:30
0

aqui está minha variante:

#!/bin/bash

[email protected]
ALERT=90
df -H | grep -vE 'abc:/xyz/pqr | tmpfs |cdrom|Used' | awk '{ print $5 " " $1 }' | while read output; do 
usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 ) 
echo $usep
partition=$(echo $output | awk '{ print $2 }' ) 
if [ $usep -ge $ALERT ]; then 
  echo  "Alert: Almost out of disk space $usep" 
  df -H | mail -s "Alert: out of disk space $usep"  $ADMIN
fi 
done
    
por 22.08.2013 / 05:21
0

Não posso comentar a resposta de Gilles acima, mas saiba que o awk está fazendo uma comparação baseada em string na segunda parte, onde:

$5 >= ALERT

Eu percebi isso quando estava testando limites de um dígito. Você pode forçar um lançamento para int usando +0, então a comparação se torna:

$5+0 >= ALERT
    
por 02.06.2017 / 16:45