Introdução
No post passado [1], vimos como criar um simples programa de monitoração utilizando a biblioteca inotify. Há, porém, um pacote chamado inotify-tools que fornece dois aplicativos para nos ajudar nessa tarefa de monitoração. O interessante aqui é que esses aplicativos podem ser utilizados em Shell Scripts. O primeiro deles, o inotifywatch faz uma estatística geral de eventos e o segundo, o inotifywait, retorna para o usuário quais eventos ocorreram nos arquivos monitorados.
Nesse post iremos aprender como utilizar as ferramentas presentes no pacote inotify-tools.
O inotify-tools
Provavelmente você não tem esses pacotes instalados por padrão, mas com certeza eles já estejam no repositório de sua distribuição.
Para instalá-lo no Fedora, digite:
$ sudo yum install inotify-tools
No Ubuntu:
$ sudo apt-get install inotify-tools
Feito isso, os dois aplicativos inotifywatch e inotifywait estarão instalados.
O inotifywatch
Como mostrado no post anterior, o sistema inotify pode ser usado para fins estatísticos, como por exemplo, nos mostrar quais eventos ocorreram em um diretório. O aplicativo inotifywatch se assemelha a isso, e seu uso é bastante simples.
Por exemplo, para monitorar um diretório, basta passar seu nome como parâmetro do programa:
$ inotifywatch ~/diretorio
Nesse caso, o inotifywatch esperará por todos os eventos. Para testar, crie e acesse arquivos no diretório indicado:
$ cp /etc/passwd ~/diretorio/arquivo $ cat ~/diretorio/arquivo $ rm -f ~/diretorio/arquivo
Pelos comandos listados, observamos que disparamos os seguintes eventos: CREATE (criação de arquivo), OPEN (abertura), ACCESS (ler arquivo), CLOSE (fechar arquivo), DELETE (deletar arquivo). Agora, vá para o terminal do inotifywatch e aperte CTRL+C, e observe os eventos capturados:
^C # pressione CTRL+C total access modify close_write close_nowrite open create delete filename 24 3 1 1 8 9 1 1 diretorio/
Com a opção -e, podemos filtrar por eventos. A lista de eventos pode ser conferida na man page do programa:
$ inotifywatch --help Events: access file or directory contents were read modify file or directory contents were written attrib file or directory attributes changed close_write file or directory closed, after being opened in writeable mode close_nowrite file or directory closed, after being opened in read-only mode close file or directory closed, regardless of read/write mode open file or directory opened moved_to file or directory moved to watched directory moved_from file or directory moved from watched directory move file or directory moved to or from watched directory create file or directory created within watched directory delete file or directory deleted within watched directory delete_self file or directory was deleted unmount file system containing file or directory unmounted
Assim, para monitorarmos somente a deleção de arquivos, fazemos:
$ inotifywatch -e delete ~/diretorio
Lista de eventos pode ser criada com o uso da vírgula:
$ inotifywatch -e access,modify,delete ~/diretorio
A opção -r do comando faz uma monitoração recursiva, ou seja, inclui os arquivos do diretório e também os dos subdiretórios dele. Use essa opção com cautela em diretórios com vários arquivos, pois isso causará uma lentidão no programa:
$ inotifywatch -r -e delete ~
O comando acima monitora se alguma arquivo foi deletado no diretório do usuário.
Para mais opções, consulte a man page do programa e também os links nas referências.
O inotifywait
Esse comando é semelhante àquele que criamos no post anterior. Assim que um evento ocorre, esse comando retorna para o usuário qual arquivo disparou o evento. Suas opções são semelhantes às do inotifywatch.
$ inotifywait -m ~/diretorio
Executando os comandos anteriores, podemos observar os eventos disparados por eles no diretório:
Setting up watches. Watches established. /home/daemonio/diretorio/ CREATE arquivo /home/daemonio/diretorio/ OPEN arquivo /home/daemonio/diretorio/ MODIFY arquivo /home/daemonio/diretorio/ CLOSE_WRITE,CLOSE arquivo /home/daemonio/diretorio/ OPEN arquivo /home/daemonio/diretorio/ ACCESS arquivo /home/daemonio/diretorio/ CLOSE_NOWRITE,CLOSE arquivo /home/daemonio/diretorio/ OPEN arquivo /home/daemonio/diretorio/ CLOSE_NOWRITE,CLOSE arquivo /home/daemonio/diretorio/ OPEN arquivo /home/daemonio/diretorio/ ACCESS arquivo /home/daemonio/diretorio/ CLOSE_NOWRITE,CLOSE arquivo /home/daemonio/diretorio/ OPEN arquivo /home/daemonio/diretorio/ ACCESS arquivo /home/daemonio/diretorio/ CLOSE_NOWRITE,CLOSE arquivo /home/daemonio/diretorio/ DELETE arquivo
A opção -m do comando utiliza o modo monitor, que espera por eventos até que CTRL+C seja pressionado. A opção -e pode ser utilizada para filtrar por eventos.
Acessando a man page do comando, observamos algumas opções interessantes. Uma em particular, a –format, utiliza uma formatação estilo printf para a saída. Veja:
$ inotifywait -m -e create --format 'Arquivo: %f | Evento(s): %e' ~/diretorio
Em seguida, criei dez arquivos em ~/diretorio. A saída foi:
Setting up watches. Watches established. Arquivo: arquivo1 | Evento(s): CREATE Arquivo: arquivo2 | Evento(s): CREATE Arquivo: arquivo3 | Evento(s): CREATE Arquivo: arquivo4 | Evento(s): CREATE Arquivo: arquivo5 | Evento(s): CREATE Arquivo: arquivo6 | Evento(s): CREATE Arquivo: arquivo7 | Evento(s): CREATE Arquivo: arquivo8 | Evento(s): CREATE Arquivo: arquivo9 | Evento(s): CREATE Arquivo: arquivo10 | Evento(s): CREATE
O formato %f obtém o nome do arquivo que disparou o evento. Se não for possível obter esse nome, uma string vazia é retornada. O formato %e indica uma lista separada por vírgula dos eventos capturados.
Se desejarmos salvar a saída do comando em CSV para um futura análise, por exemplo no Excel, basta utilizarmos a opção -c:
$ inotifywait -m -c -e delete ~/diretorio Setting up watches. Watches established. /home/daemonio/diretorio/,DELETE,arquivo1 /home/daemonio/diretorio/,DELETE,arquivo10 /home/daemonio/diretorio/,DELETE,arquivo2 /home/daemonio/diretorio/,DELETE,arquivo3 /home/daemonio/diretorio/,DELETE,arquivo4 /home/daemonio/diretorio/,DELETE,arquivo5 /home/daemonio/diretorio/,DELETE,arquivo6 /home/daemonio/diretorio/,DELETE,arquivo7 /home/daemonio/diretorio/,DELETE,arquivo8 /home/daemonio/diretorio/,DELETE,arquivo9
Usos comuns
Em se tratando de monitoração de arquivos, várias aplicações interessantes surgem, como visto em [1]. Um exemplo que vi em [3] é utilizar esses comandos para sabermos quais arquivos uma aplicação acessou.
Por exemplo, se estamos desconfiados que um aplicativo (ex: /bin/sudo) acessa determinado arquivo (ex: /etc/shadow), podemos monitorar tal arquivo para conferir se isso é verdade:
$ sudo inotifywait /etc/shadow # Em outro terminal $ sudo su
A saída será:
Setting up watches. Watches established. /etc/shadow OPEN
Isso vale também para monitorarmos pastas de cache de navegadores web:
$ inotifywait -m -r .mozilla/firefox --format 'Arquivo: %f' # Após abrir o firefox, o programa retorna várias linhas... ... .mozilla/firefox/grhvdl4r.default/Cache/ ACCESS _CACHE_001_ .mozilla/firefox/grhvdl4r.default/Cache/ MODIFY _CACHE_001_ .mozilla/firefox/grhvdl4r.default/Cache/ ACCESS _CACHE_003_ .mozilla/firefox/grhvdl4r.default/Cache/ MODIFY _CACHE_001_ .mozilla/firefox/grhvdl4r.default/Cache/ MODIFY _CACHE_001_ .mozilla/firefox/grhvdl4r.default/Cache/ MODIFY _CACHE_001_ .mozilla/firefox/grhvdl4r.default/Cache/4/7D/ CREATE 472D7d01 .mozilla/firefox/grhvdl4r.default/Cache/4/7D/ OPEN 472D7d01 .mozilla/firefox/grhvdl4r.default/Cache/4/7D/ MODIFY 472D7d01 .mozilla/firefox/grhvdl4r.default/Cache/4/7D/ MODIFY 472D7d01 .mozilla/firefox/grhvdl4r.default/Cache/4/7D/ MODIFY 472D7d01 .mozilla/firefox/grhvdl4r.default/Cache/4/7D/ MODIFY 472D7d01 .mozilla/firefox/grhvdl4r.default/Cache/4/7D/ MODIFY 472D7d01 .mozilla/firefox/grhvdl4r.default/Cache/4/7D/ MODIFY 472D7d01 .mozilla/firefox/grhvdl4r.default/Cache/4/7D/ MODIFY 472D7d01 .mozilla/firefox/grhvdl4r.default/Cache/4/7D/ MODIFY 472D7d01 .mozilla/firefox/grhvdl4r.default/Cache/4/7D/ MODIFY 472D7d01 .mozilla/firefox/grhvdl4r.default/Cache/4/7D/ CLOSE_WRITE,CLOSE 472D7d01 ...
Outra aplicação também é a monitoração de arquivos modificados em um diretório para em seguida, enviá-los para alguma estação de backup, por exemplo. Desse modo, poderíamos criar aplicações estilo aquela do Dropbox, que detecta automaticamente arquivos modificados e os enviam para sua pasta pessoal na Internet.
Ficarei devendo um script utilizando esses comandos, mas futuramente devo postar algo.
Referências
[1] monitorando Sistemas De Arquivos Com o inotify Em C by Daemonio (Acessado em: Setembro/2012)
https://daemoniolabs.wordpress.com/2012/09/25/monitorando-sistemas-de-arquivos-com-inotify-em-c/
[2] inotify, monitoring file system by SAEKI Yoshiyasu (Acessado em: Setembro/2012)
http://laclefyoshi.blogspot.com.br/2010/12/inotify-monitoring-file-system.html
[3] Linux – How to tell which files are sourced at login? by serverfault (Acessado em: Setembro/2012)
http://serverfault.com/questions/276761/linux-how-to-tell-which-files-are-sourced-at-login
[4] tooltip – inotify-tools by Erik Ljungstrom (Acessado em: Setembro/2012)
http://northernmost.org/blog/tooltip-inotify-tools/
Boa noite, no caso em que estou envolvido um software cria novos arquivos em um diretório específico a cada 1 minuto. Poderia me dar uma luz de como executo um script (pode ser um básico, ler o arquivo novo adicionado e adicionar as informações em um outro qualquer) toda vez que entrar um novo arquivo na pasta?
Olá,
você pode usar o inotifywait.
inotifywait -m -e create diretorio_monitorado/
Ele vai listar os arquivos criados. A saída pode ser enviada para um arquivo ou conexão remota em tempo real usando “pipes”:
inotifywait -m -e create diretorio_monitorado/ | tee arquivo_de_saida.txt
ou
inotifywait -m -e create diretorio_monitorado/ | nc
Caso for algo específico e eu possa ajudar, favor enviar um e-mail para: undefinido gmail.com