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.