Detectar automaticamente quando um arquivo atingiu um limite de tamanho

7

Eu gostaria de enviar um e-mail quando um arquivo atingir um determinado limite de tamanho.

A única maneira que pensei em fazer isso é fazendo um cronjob que irá verificar o tamanho do arquivo e enviar o e-mail se o arquivo for maior que o tamanho desejado.

No entanto, parece uma solução ruim para mim adicionar um cronjob que verificaria, por exemplo, a cada 15-30 min, o tamanho de um arquivo?

Eu queria saber se existe uma maneira melhor de fazer isso para detectar automaticamente quando o arquivo é anexado a algum texto (evento?) para que eu possa verificar o tamanho e fazer o tratamento desejado.

    
por Jean-François Savard 26.05.2014 / 18:03

1 resposta

7

Eu posso conceber duas abordagens para fazer isso. Você pode usar um loop while que executaria um comando "stat" em alguma frequência definida, executando uma verificação para ver se o tamanho do arquivo excedeu o tamanho desejado. Se tiver, envie um email. Este método é OK, mas pode ser um pouco ineficiente, já que vai rodar o comando "stat", independente de haver um evento no arquivo ou não, na freqüência de tempo definida.

O outro método envolveria o uso de eventos do sistema de arquivos nos quais você pode assinar observadores usando o comando inotifywatch .

Método 1 - Cada X segundo exemplo

Se você colocar o seguinte em um script, diga notify.bash :

#!/bin/bash

file="afile"
maxsize=100    # 100 kilobytes

while true; do
    actualsize=$(du -k "$file" | cut -f1)
    if [ $actualsize -ge $maxsize ]; then
        echo size is over $maxsize kilobytes
        .... send email ....
        exit
    else
        echo size is under $maxsize kilobytes
    fi

    sleep 1800 # in seconds = 30 minutes
done

Em seguida, execute-o, ele informará sobre qualquer acesso ao arquivo. Se esse acesso resultar no tamanho do arquivo que excede seu tamanho mínimo, ele acionará um e-mail a ser enviado e sairá. Caso contrário, ele informará o tamanho atual e continuará assistindo o arquivo.

Método # 2 - Somente verifique no exemplo de acessos

O método mais eficiente seria verificar apenas o arquivo quando houver acessos reais. Os tipos de acessos podem variar, pois neste exemplo estou ilustrando como assistir apenas a acessos a arquivos, mas você pode assistir apenas a outros eventos, como o fechamento do arquivo. Novamente, nomearemos este arquivo, notify.bash :

#!/bin/bash

file=afile
maxsize=100 # 100 kilobytes

while inotifywait -e access "$file"; do
    actualsize=$(du -k "$file" | cut -f1)
    if [ $actualsize -ge $maxsize ]; then
        echo size is over $maxsize kilobytes
        .... send email ....
        exit    
    else
        echo size is under $maxsize kilobytes
    fi
done

A execução deste script resultaria na seguinte saída:

$ ./notify.bash 
Setting up watches.
Watches established.

Gerando alguma atividade no arquivo, o arquivo agora informa seu tamanho da seguinte forma:

$ seq 100000 > afile
$ du -k afile 
576 afile

A saída do nosso script de notificação:

afile ACCESS 
size is over 100 kilobytes

Em que ponto sairia.

Enviando e-mail

Para realizar esta atividade, você pode simplesmente fazer algo assim dentro do script:

subject="size exceeded on file $file"
emailAddr="[email protected]"
mailCmd="mail -s \"$subject\" \"$emailAddrs\""
( echo ""; echo "DATE: $(date)"; ) | eval mail -s "$subject" \"$emailAddr\"

Considerações

O segundo método, como é, funcionará na maioria das situações. O que não ocorrerá é se o arquivo já estiver excedendo o $maxsize quando o script for invocado e não houver mais eventos no arquivo do tipo access . Isso pode ser corrigido com uma verificação adicional executada no script quando ele é invocado ou expandindo os eventos em que inotifywatch atua.

Referências

por 27.05.2014 / 01:44