enviando e-mail se o espaço em disco exceder

1

Eu tenho um script para calcular o espaço em disco disponível e alerta por email se o limite exceder um determinado valor definido por mim. Aqui está o script:

df -H | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print  " "  }' | while read output;
do
    usep=$(echo $output | awk '{ print }' | cut -d'%' -f1  )
    partition=$(echo $output | awk '{ print  }' )
    if [ $usep -ge $Alert ]; then
    MessageSpace="Running out of space \"$partition ($usep%)\" on $(hostname) as on $(date)"
    spacealert
    fi
done

Agora, o problema é que se eu tiver dois discos cujo limite excedeu o limite determinado, ele gerará dois e-mails separados. Posso fazer para enviar apenas um único e-mail para mim? Obrigado.

    
por Tarun 12.12.2013 / 07:24

1 resposta

1

Uma abordagem é criar um arquivo temporário e gravar todos os alertas de uso excessivo nesse arquivo. Se, depois de passarmos por todas as partições, o arquivo não estiver vazio, uma mensagem de email será enviada:

tmpfile="$HOME/.fs_usage_check.tmp"
echo -n "" >"$tmpfile"
df -H | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print  " "  }' | while read output;
do
    usep=$(echo $output | awk '{ print }' | cut -d'%' -f1  )
    partition=$(echo $output | awk '{ print  }' )
    if [ $usep -ge $Alert ]; then
        echo "Running out of space \"$partition  ($usep%)\" on $(hostname) as on $(date)" >>"$tmpfile"
    fi
done
if [ -s "$tmpfile" ] ; then
    mail  -s "Disk Space Warning" someone@host <"$tmpfile"
fi
rm -f "$tmpfile"

Não estou familiarizado com o utilitário spacealert que você estava usando, então substituí mail pelo envio do e-mail.

A propósito, acho que as instruções awk / while / read podem ser simplificadas um pouco:

tmpfile="$HOME/fs_usage_check.tmp"
echo -n "" >"$tmpfile"
df -H | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print , }' | while read partition usep ; do
    if [ ${usep%%%} -ge $Alert ]; then
        echo "Running out of space \"$partition  ($usep)\" on $(hostname) as on $(date)" >>"$tmpfile"
    fi
done
if [ -s "$tmpfile" ] ; then
    mail  -s "Disk Space Warning" someone@host <"$tmpfile"
fi
rm -f "$tmpfile"

Nesta forma simplificada, a variável usep muda um pouco: ela ainda tem o sinal '%' anexado. Precisamos remover o sinal de porcentagem para fazer uma comparação numérica. O Bash tem uma expansão de parâmetro especial para remover tais sufixos que se parece com ${var%pattern} ou, para remover o sufixo de correspondência de padrão mais longo, ${var%%pattern} . No nosso caso, como o padrão em si é um sinal de porcentagem, o mesmo que o caractere mágico do bash, precisamos dele (como em ${usep%\%} ) ou usar o comando de correspondência mais longo (como em ${usep%%%} ).

Observe que o loop do while está em um pipeline e, portanto, em um subshell (suponho que você esteja usando o bash ou dash ou shell similar). Assim, nenhuma de suas variáveis de ambiente sobrevive fora do loop. O arquivo temporário, é claro, sobrevive e isso faz com que seja bom sinalizar se uma mensagem deve ser enviada.

    
por John1024 12.12.2013 / 07:40