Existem muitas ocasiões onde é necessário monitorizar o nosso sistema de ficheiros, para saber o que se passa com algum ficheiro ou directoria. Existem muitas soluções, mas há algumas melhores que outras. Em Linux existe algo que se chama inotify.
A maioria dos sitemas Linux mais recentes já traz suporte para o inotify.
grep -i inotify /boot/config-$(uname -r)
CONFIG_INOTIFY=y
CONFIG_INOTIFY_USER=y
Como o inotify está no kernel, todos os programas desenvolvidos para Linux podem tirar partido dele sem usar nenhuma biblioteca especial.
Existe um conjunto de ferramentas, inotify-tools, que contém programas para usar esta funcionalidade fantástica do kernel. Esta ferramenta inclui aplicações como inotifywait e inotifywatch.
Primeiro, vamos instalar o inotify-tools. Em CentOS 6 não existe qualquer pacote nos repositorios oficiais, mas, estão disponiveis RPMs.
Em http://pkgs.repoforge.org/inotify-tools/, há pacotes para CentOS 6.
Se usarem o CentOS 6, o wget também não vem instalado e precisam de o instalar:
yum install wget
wget http://pkgs.repoforge.org/inotify-tools/inotify-tools-3.13-1.el6.rf.x86_64.rpm
rpm -ivh inotify-tools-3.13-1.el6.rf.x86_64.rpm
Para terem uma ideia do que o inotifywatch faz, experimentem:
Por exemplo, para monitorizar a nossa home
inotifywatch -r ~
Numa outra consola, abram o firefox, ou alguma outra aplicação.
Agora, na consola onde têm o inotifywatch aberto, interrompam a execução (Ctrl + C) e vejam as estatísticas que ele devolve:
total attrib close_write close_nowrite open create delete filename
15 1 1 4 5 1 3 /root/
Com esta ferramenta, podem ver estatisticas .
Este comando vai verificar, recursivamente, todos os eventos que ocorrem na nossa home (neste caso). Podemos também refinar o nosso comando e apenas monitorizar os eventos que desejamos, usando a opção -e:
inotifywatch -e create, delete, delete_self -r ~
Desta forma, apenas quando ficheiros (ou directorias) forem criadas ou apagadas é que serão gerados eventos. Para saberem quais os eventos que podemos monitorizar:
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
Com este comando, iremos ver (quando o terminarmos) o que aconteceu.
Existe um comando melhor, que permite visualizar em tempo real o que está a acontecer, ao contrário do inotifywatch. Esse comando chama-se inotifywait.
yum install perl-Event perl-Mail-Sendmail perl-XML-Simple perl-XML-SimpleObject perl-Linux-Inotify2
Linha de comandos
./iwatch -r -e create,delete -m <nome>@<dominio> /tmp
touch istoficheiro
IN_CREATE /tmp/istoficheiro
[12/Jan/2011 19:35:44] * Send email to <nome>@<dominio>
IN_DELETE /tmp/istoficheiro
[12/Jan/2011 19:36:51] * /tmp/istoficheiro is deleted
[12/Jan/2011 19:36:51] * Send email to <nome>@<dominio>
./iwatch -r -e create,delete -c "top" /tmp
touch ficheiro
[14/Jan/2011 14:30:33] IN_CREATE /tmp/ola
[14/Jan/2011 14:30:33] * /tmp/ola is deleted
[14/Jan/2011 14:30:33] * Command: top
Daemon mode
<config charset="utf-8">
<guard email="root@localhost" name="IWatch"/>
<watchlist>
<title>Public Website</title>
<contactpoint email="webmaster@localhost" name="Web Master"/>
<path type="single" syslog="on">/var/www/localhost/htdocs</path>
<path type="single" syslog="off">/var/www/localhost/htdocs/About</path>
<path type="recursive">/var/www/localhost/htdocs/Photos</path>
<path type="single" events="default,access" alert="off" exec="(w;ps)|mail -s '%f is accessed at %{%H:%M:%S}d' root@localhost">/tmp/dir3</path>
<path type="exception">/etc/mail/statistics</path>
</watchlist>
</config>
<config charset="utf-8">
<guard email="iwatch@localhost" name="IWatch"/>
<watchlist>
<title>Public Website</title>
<contactpoint email="webmaster@localhost" name="webmaster"/>
<path type="recursive" alert="off" events="create,delete,modify" exec="rsync -avz --delete -e ssh /var/www/html/ root@otherHost:/var/www/html">/var/www/html</path>
</watchlist>
</config>
cp iwatch.xml iwatch.dtd /etc
cp iwatch /usr/local/bin
/usr/local/bin/iwatch -d -v
ps -aef | grep -i iwatch
root 3377 1 1 15:10 ? 00:00:00 /usr/bin/perl -T /usr/local/bin/iwatch -d -v