Inotify – Monitore seus arquivos e diretórios

Inotify (inode notify) é um subsistema do kernel, que visa observar as mudanças no sistema de arquivos e relatar essas alterações para aplicações. Foi incorporado no kernel 2.6.13 por John_McCutchan. Neste post, irei demonstrar utilizando um código em C e outro com Shell-Script.

Vamos testar com o código simples em C, crie um arquivo “inotify_example.c” com o conteúdo abaixo:
  
  
  #include <stdio.h>
  #include <stdlib.h>
  #include <errno.h>
  #include <sys inotify.h>
  #include <unistd.h>
  
  #define EVENT_SIZE  (sizeof(struct inotify_event))
  #define BUF_LEN        (1024 * (EVENT_SIZE + 16))
  
  int main(void) {
   int length, i = 0;
   int fd;
   int wd;
   char buffer[BUF_LEN];
   const char *root = "/tmp";
  
   printf("monitorando o diretorio /tmpn");
   
   sleep(1);
   
   fd = inotify_init();
  
   if (fd < 0) {
    perror("erro na chamada: inotify_init");
    exit(1);
      }
  
   wd = inotify_add_watch(fd, root, IN_MODIFY | IN_CREATE | IN_DELETE);
   length = read(fd, buffer, BUF_LEN);
  
   if (length < 0) {
    perror("erro ao ler o buffer");
    exit(1);
   }
  
   while (i < length) {
    struct inotify_event *event = (struct inotify_event *) &buffer[i];
    if (event->len) {
     if (event->mask & IN_CREATE) {
      printf("O arquivo %s foi criado.n", event->name);
     } else if (event->mask & IN_DELETE) {
      printf("O arquivo %s foi deletado.n", event->name);
     } else if (event->mask & IN_MODIFY) {
      printf("O arquivo %s foi modificado.n", event->name);
     }
    }
    i += EVENT_SIZE + event->len;
   }
  
   inotify_rm_watch(fd, wd);
   close(fd);
   return 0;
  }
   
Compilando e testando
  
  
   $ gcc inotify_example.c -o inotify_example
   $ ./inotify_example # coloque em background com & ou coproc
   echo "testando" > /tmp/teste.txt
   O arquivo teste.txt foi criado.
  
  
Inotify com shell script
O pacote inotify-tools possui diversos programas, vou utilizar um em específico, o inotifywait.
Instalação
  
  
   # apt-get install inotify-tools
  
  
Monitorando um diretório
O inotifywait possui uma lista de eventos, listei e comentei alguns:
access: Um arquivo foi lido.
modify: Arquivo modificado.
attrib: Os metadados de um arquivo foi modificado. Isso inclui timestamp, permissões, atributos etc.
close_write: Um arquivo foi fechado, depois de ser aberto no modo gravável. Isto não implica, necessariamente, que o arquivo foi gravado.
close_nowrite: Um arquivo fechado, depois de ser aberto no modo somente leitura.
open: Um arquivo foi aberto.
moved_to: Arquivo/Diretório foi movido para o diretório que está sendo observado.
move_self: O diretório monitorado foi movido. Após este evento, o arquivo ou diretório não está sendo observado.
create: Arquivo/Diretório foi criado.
delete: Arquivo/Diretório foi deletado.
delete_self: O diretório que está sendo assistido, foi deletado.
unmount: O diretório que está sendo observado, foi desmontado.
Para demonstrar a utilização desta bela ferramenta, crie um arquivo “inotify_example.sh” com o conteúdo abaixo:

 

  
  
  #!/bin/bash
  NOTIFYDIR="/tmp"
  inotifywait -r -m $NOTIFYDIR -e modify,attrib,close_write,move,create,delete | while read path action file; do
       echo "Acao: $action - ${path}${file}"
  done
  
  
  
  
   $ chmod +x inotify_example.sh
   $ ./inotify_example.sh  # coloque em background com & ou coproc
   echo "testando" > /tmp/teste.txt
   Acao: MODIFY - /tmp/teste.txt
   Acao: CLOSE_WRITE,CLOSE - /tmp/teste.txt
  
  
Com isto, é possível logar as atividades na pasta em que está sendo observada. Por exemplo, aquele seu amigo que entra no seu servidor e deleta sua coleção de milhares de videos do Xvideos.

Programador Python/Cython/ShellScript/C/C++/QT/JS e Administrador de Redes.
Apaixonado por visão computacional, em específico Machine Learning/BackgroundSubtractor/Face Recognition e Object Tracking.
Atualmente desenvolvendo trabalhos voltados à contagem de pessoas. Se diverte utilizando suas raspberry’s e odroid’s para detectar rostos e sinalizar quando alguém está prestes a bater à porta para encher o saco.

 

Que tal nos encontrar no SeuTubo para ver dicas, tutoriais e Reviews de placas? Canal Sistemas Embarcados

Que tal na página do Facebook?

 

Ou Instagram?

 

Quem sabe Google Plus?

 

Que tal no Pinterest?

 

Ou talvez nos encontrar no Twitter para receber as ultimas noticias quentinhas: @SEmbarcados

 

E não esqueça que também tem o email, contato@sistemasembarcados.org

 

Conheça também nossos grupos do Facebook:

Abraços e até o próximo embarcado!