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:
- Usa inotify_init para abrir um descritor de arquivo
- Adiciona uma ou mais procuras
- Aguarda os eventos
- 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.