Monitorando arquivos com inotify

O programa “inotify” realiza o monitoramento de eventos do sistema de arquivo como abrir, fechar, mover/renomear, deletar, criar ou alterar atributos. Essas informações podem ser úteis para monitorar desempenho, segurança, cópia de arquivos logo que foram gerados, etc. Um típico programa de monitoramento faz o seguinte:

  1. Usa inotify_init para abrir um descritor de arquivo
  2. Adiciona uma ou mais procuras
  3. Aguarda os eventos
  4. Processa os eventos e retorna a aguardar mais eventos

Quando não há mais procuras ativas, ou em determinado sinal, fecha o descritor de arquivo, faz a limpeza e sai.

Mais detalhes do algoritmo podem ser vistos no artigo IBM – Monitore eventos do sistema de arquivos Linux com o inotify, disponível no link.

Exemplos no Linux

Instale o programa através do comando “sudo apt-get install inotify-tools”. Para os exemplos a seguir, crie a seguinte estrutura de arquivos (dois níveis com um arquivo dentro) e execute o comando “inotifywatch”:

Abra um novo terminal e dê o comando “ls dir1/dir2/”. Volte ao terminal anterior e dê CTRL+C para encerrar o monitoramento. A saída deve ser desse tipo:

Ele mostra um total de 4 eventos para cada um dos diretórios monitorados: 2 acessos, uma abertura e um fechamento sem escrita.

Usando o comando “inotifywait”, execute novamente o comando “ls dir1/dir2/” no outro terminal. Veja a saída:

Ele espera alterações no diretório ou arquivo informado(s) para encerrar. É possível adicionar alguns parâmetros para desenvolver mais ações:

  • -m: não fechar o programa após acontecer evento
  • -e nome_evento: monitora um evento específico (por exemplo, para acompanhar criação e movimentação para o diretório monitorado, usa-se “-e create -e moved_to”)

Os nome dos eventos são bem intuitivos: access, modify, attrib, close_write, close_nowrite, close, open, moved_to, moved_from, move, move_self, create, delete, delete_self, unmount.

O script a seguir executa o monitoramento para um diretório (determinado em “path”) e imprime o nome do arquivo criado e/ou modificado. O pipe redireciona o fluxo do while (usado para ficar continuamente lendo o diretório) para o inotify (baseado em resposta do Stack Overflow):

O “if” serve para imprimir a mensagem somente se o arquivo tiver “.csv” no nome.