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”:

mkdir -p dir1/dir2 ; touch dir1/dir2/file1
inotifywatch dir1/ dir1/dir2/ dir1/dir2/file1

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:

$ inotifywatch dir1/ dir1/dir2/ dir1/dir2/file1
Establishing watches...
Finished establishing watches, now collecting statistics.

total  access  close_nowrite  open  filename
4      2       1              1     dir1/
4      2       1              1     dir1/dir2/

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:

$ inotifywait dir1/dir2/
Setting up watches.
Watches established.
dir1/dir2/ OPEN,ISDIR 
[1]-  Concluído              inotifywatch dir1/dir2/
[2]+  Concluído              inotifywatch dir1/dir2/

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):

#!/bin/bash
## Script para imprimir arquivos criados/modificados

path='/home/somar/Downloads/dir1'
/usr/bin/inotifywait -m $path -e create -e moved_to |
    while read path action file; do
	echo $file
        if [[ "$file" == *.csv ]]; then
            echo "CSV file"
        fi
    done

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