Monitorando Com O inotify-tools

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/

2 pensamentos sobre “Monitorando Com O inotify-tools

  1. 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

Deixe um comentário