Ya sabemos que todos los sistemas UNIX-like, como GNU/Linux, tienen muchas ventajas, una de ellas es la facilidad de ver qué está pasando en el sistema mediante la consulta de los respectivos registros o logs. Ya sea el acceso al sistema, los correos que el sistema operativo envía o recibe, el estado de los servicios o el estado del núcleo o kernel, lo podemos controlar todo. La herramienta de la que hablaré hoy está relacionada con este tema. Se trata de ‘inotify-tools’, un conjunto de herramientas que utilizan el subsistema del kernel de Linux llamado “Inotify”.
Seguramente no os sonará, pero este subsistema del kernel Linux actúa para extender los sistemas de ficheros, a fin de detectar los cambios en éstos. Es un reemplazo para ‘dnotify’, que tenía un objetivo similar.
Un poco de historia sobre Inotify
Este subsistema fue creado por John McCutchan y se incorporó al kernel de Linux en agosto del año 2005. A partir de entonces se han ido incorporando mejoras.
Tiene múltiples usos, como permitir reindexar los archivos modificados sin escanear el sistema de ficheros, una de las virtudes que hacen que sea utilizado por una herramienta como Beagle. También se puede utilizar para actualizar vistas de directorios, volver a cargar archivos de configuración, registrar cambios (en el artículo veremos cómo) o incluso realizar copias de seguridad.
Instalación de Inotify-tools sobre GNU Linux
En muchas distribuciones estas herramientas ya vienen instaladas por defecto. Si en tu caso no fue así, a continuación te explico cómo solucionarlo.
En esta ocasión yo estoy utilizando un sistema operativo CentOS 7, por lo que esta explicación también serviría para RHEL 7. También os voy a explicar cómo instalarlo en otras distros, no os preocupéis.
Para empezar tenemos que tener habilitado el repositorio EPEL. Su instalación sería así:
yum install epel-release yum install inotify-tools
Para versiones anteriores, como las 5 y 6, tenemos que descargarlo desde el repositorio EPEL de Fedora:
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/inotify-tools-3.14-1.el6.x86_64.rpm rpm -ivh inotify-tools-3.14-1.el6.x86_64.rpm
En sistemas basados en Debian, ya sea Linux Mint o Ubuntu, está disponible en los repositorios oficiales:
apt-get install inotify-tools
En Fedora debemos utilizar los repositorios ‘extras’ e instalar:
yum install inotify-tools
En el amigable sistema operativo Gentoo (modo ironía on), las herramientas también están disponibles en los repositorios oficiales:
emerge inotify-tools
En lo que respecta a Arch y derivadas, sería de la siguiente manera:
pacman -S inotify-tools
Está disponible para muchas más distribuciones, podéis consultar la página oficial del proyecto en GitHub.
Trabajar con la herramienta
Una vez que ya lo tenemos instalado podemos empezar a trabajar. Una herramienta que nos puede ser de gran utilidad es ‘inotifywait’, que nos permite monitorizar un recurso en concreto, por ejemplo:
inotifywait –m /home/test
Esto lo haría “en directo”, veríamos todos los cambios:
[root@centos7 home]# Setting up watches. Watches established. /home/test/ CREATE,ISDIR prueba1 /home/test/ CREATE,ISDIR prueba2 /home/test/ MOVED_FROM,ISDIR prueba1 /home/test/ MOVED_TO,ISDIR prueba3 /home/test/ OPEN,ISDIR /home/test/ CLOSE_NOWRITE,CLOSE,ISDIR /home/test/ OPEN,ISDIR prueba2 /home/test/ CLOSE_NOWRITE,CLOSE,ISDIR prueba2 /home/test/ DELETE,ISDIR prueba2 /home/test/ OPEN,ISDIR prueba3 /home/test/ CLOSE_NOWRITE,CLOSE,ISDIR prueba3 /home/test/ DELETE,ISDIR prueba3
Si queremos que nos muestre unos eventos en concreto, lo podemos indicar utilizando el parámetro ‘e’ :
inotifywait -e create,delete,modify,move,attrib /home/test
Si nos interesa, podemos crear un pequeño script para que nos envíe por correo cualquier modificación de un recurso en concreto de nuestro servidor:
#!/bin/sh /usr/bin/inotifywait -e create,delete,modify,move,attrib -mrq /dir | while read line; do path=`echo $line | /usr/bin/awk '{print $1}'` echo $line | /bin/mail -s "[inotify info] $path" $USER done
Por último, pero no menos importante, vamos a ver cómo crear un fichero de log, con todos los cambios en un directorio que nosotros le indiquemos:
inotifywait -m -r /home/test --timefmt %d-%m-%Y --format '%T%w%f%e' >> /var/log/log-test.txt
Para ejecutarlo en segundo plano podemos utilizar tanto el comando ‘screen’ como el comando ‘nohup’, creando un script previo con la línea en cuestión, por ejemplo:
vi script-test.sh #!/bin/bash inotifywait -m -r /home/test --timefmt %d-%m-%Y --format '%T%w%f%e' >> /var/log/log-test.txt
Una vez hemos guardado y salido del editor, podemos escribir:
nohup bash script-test.sh </dev/null >/dev/null 2>&1 &
O bien:
screen –dm bash script-test.sh </dev/null >/dev/null 2>&1 &
O directamente:
bash script-test.sh </dev/null >/dev/null 2>&1 & disown
Otra opción muy interesante es añadirlo como servicio en versiones que no utilicen systemd:
#!/bin/bash # chkconfig: 2345 90 60 case "$1" in start) nohup script-test.sh > /dev/null 2>&1 & echo $!>/var/run/script-test.sh.pid ;; stop) pkill -P `cat /var/run/script-test.sh.pid` rm /var/run/script-test.sh.pid ;; restart) $0 stop $0 start ;; status) if [ -e /var/run/script-test.sh.pid ]; then echo script-test.sh is running, pid=`cat /var/run/script-test.sh.pid` else echo script-test.sh is not running exit 1 fi ;; *) echo "Usage: $0 {start|stop|status|restart}" esac exit 0
Espero que este artículo, en algún momento, os pueda ser de utilidad. Nos vamos leyendo.
Para elaborar el artículo he utilizado las siguientes fuentes:
Artículo en Wikipedia sobre Inotify (en inglés)
Solución en el foro de Red Hat
Wiki en GitHub sobre inotify-tools
Artículo sobre inotify en la web Askubuntu.com
Entrada sobre inotify en la web Agix.com.au
Cómo trabajar con inotify en segundo plano by Stackoverflow
Sobre los derechos de la imagen de portada | Flickr
Herramienta muy útil que desconocía. Seguro que le podré sacar muchos usos en mi raspberry. Gracias!