While Read loop to email

0

Estou tendo problemas com um script que estou escrevendo. Estou tentando monitorar o espaço livre em disco e ter um email gerado para cada sistema de arquivos em um determinado limite. Ao usar este script com 'echo' em vez de 'mail', a saída parece correta para o meu terminal. Quando eu incorporo e-mail, apenas o aviso crítico é enviado e o corpo do e-mail inclui os outros sistemas de arquivos. Estou tentando enviar e-mails individuais para cada sistema de arquivos. Eu não estou procurando uma resposta, mas talvez um certo lugar para se concentrar em tentar determinar qual é o meu problema.

 #!/bin/bash
    #The following script will check filesystems (local/nfs only)
    #and notify via email current user if over certain threshold.

    #Thresholds for script to call
    CRITICAL=90
    ALERT=70

    #Gets local/nfs disk info, greps out header/tmp filesystems and awks column 1 and 5
    #while read loop is enabled to parse through each line
    df -l | grep -vE '(^Filesystem)' | awk '{ print ($5  " " $1)}' | while read output;
    do
        #updates variables to reads current step
        usage=$( echo $output | awk '{print $1}' | cut -d'%' -f1 )
        part=$( echo $output | awk '{print $2}' )

        #if percentage matches alert or critical, email current user
        if [ $usage -ge $CRITICAL ]; then
            mail -s "Critical Warning: Filesystem $part is at $usage% of capacity." $USER
        elif [ $usage -ge $ALERT ]; then
            mail -s "Warning: Filesystem $part is at $usage% of capacity." $USER
        fi
    done
    
por Barbados Slim 09.03.2015 / 18:55

2 respostas

2

Seu comando mail espera que sua mensagem esteja em STDIN e, portanto, leia o restante da saída gerada pelo seu df ... awk pipeline.

Se você realmente não quiser nenhum corpo de mensagem em sua mensagem de e-mail, simplesmente canalize STDIN em /dev/null :

mail -s "Critical Warning: Filesystem $part is at $usage% of capacity." $USER </dev/null
    
por 09.03.2015 / 19:01
1

Como mencionado acima, o correio está precisando de algum tipo de dados stdin ou / dev / null para evitar que ele capture o stdio.

Mas, talvez, em vez de dados nulos, talvez você queira incluir mais informações no corpo do e-mail que possam ajudar a diagnosticar problemas. Este exemplo adiciona um carimbo de dados extra. (sempre útil para evitar encaminhadores de mensagens configurados incorretamente de mexer com carimbos de data e hora em cabeçalhos de correio) um relatório completo de df em todos os discos, não apenas o problema, e um instantâneo dos processos atuais que podem ser úteis se o espaço em disco estiver sendo preenchido por um processo de fuga.

Example:
mail -s "Critical Warning: Filesystem $part is at $usage% of capacity." $USER << EOM

Critical Report Generated 'date'
Disk status:
'df -h'
Process Status: 
'top -b -n 1'
EOM
    
por 09.03.2015 / 22:16