Tutorial de "incron"

linux_tux

Incron es un demonio (de los buenos :-)) que monitoriza los eventos que ocurren en el sistema de fichero. Incron esta basado en Inotify. Con Incron, entre otras muchas cosas, puedes crear un sistemas de backups, control de versiones, estadísticas del uso de ciertos ficheros, notificar a otro demonio sobre el cambio en su fichero de configuración, etc.

Instalación: La instalación es muy sencilla, en mi caso, uso Ubuntu 8.10. Desde la línea de comandos: sudo aptitude install icron Una vez que se ha instalado, automáticamente arranca el demonio.

Incron funciona a base de tablas de reglas. Las sintaxis básica de estas reglas es la siguiente: <directorio/fichero> <evento> <comando> La separación entre cada elemento debe ser de uno o mas espacios. <dirección/fichero> - es el directorio o fichero que queremos que Incron monitorice. <evento> - es el evento que queremos que Incron monitorice. Se pueden definir mas de un evento en la misma regla, separándolos por comas. <comando> - es el comando que queremos que Incron ejecute.

Antes de poder usar incrontab, tenemos que darle permisos al usuario con el que queramos crear nuestras reglas. Incron dispone, al que cron, de dos ficheros llamados /etc/incron.allow y /etc/incron.deny. Para darle permisos a un usuario, sólo tenemos que editar el /etc/incron.allow añadirlo ahí. Incluso el usuario root debe de ser añadido a dicho fichero si queremos ejecutar dicho comando como root. Otra forma, que yo personalmente no recomendaría, sería borrar el /etc/incron.allow. De esta forma todos los usuarios tendrían permiso.

incrontab. incrontab es comando que nos va a permitir manipular nuestras reglas.

incrontab -l : nos muestra las reglas que tenemos definidas. incrontab -t : nos muestra la lista de eventos soportados.

IN_ACCESS: Un fichero es accedido IN_MODIFY: Un fichero es modificado. IN_ATTRIB: Cambio en los Metadatos (permisos, atributos, fecha, etc.) IN_CLOSE_WRITE: Fichero que se abrió en modo escritura ha sido cerrado. IN_CLOSE_NOWRITE: Fichero que se no abrió en modo escritura ha sido cerrado. IN_OPEN: Se ha abierto un fichero. IN_MOVED_FROM: Fichero ha sido movido fuera del directorio que estamos monitorizando. IN_MOVED_TO: Fichero se ha movido al directorio que estamos monitorizando. IN_CREATE: Creación de un nuevo fichero o directorio en el directorio que estamos monitorizando. IN_DELETE: Un fichero o directorio ha sido borrado en el directorio monitorizado. IN_DELETE_SELF: El fichero o directorio que estaba siendo monitorizado ha sido borrado. IN_CLOSE: Incluye los eventos IN_CLOSE_WRITE y IN_CLOSE_NOWRITE. IN_MOVE: Incluye los eventos IN_MOVED_FROM y IN_MOVED_TO IN_ALL_EVENTS: Monitoriza todos los eventos. IN_DONT_FOLLOW: No desreferencia el path si es un enlace simbólico. IN_ONLYDIR: Sólo monitoriza el path si es un directorio IN_MOVE_SELF: Cuando el fichero o directorio es movido. IN_ONESHOT: Monitoriza el path para un sólo evento.

incrontab -e : nos permite editar las reglas. incrontab -r : borra la tabla de reglas por completo. OJO, ¡NO PIDE CONFIRMACION! incrontab -d : recarga la tabla de reglas. Cuando modifiquemos nuestra tabla de reglas, para que se haga efectivo, tenemos que ejecutar este comando.

incrontab -u : ejecuta incrontab como otro usuario. La intención de esta opción es el poder modificar la tabla de reglas de los usuarios del sistema que no suelen tener shell, como apache, postfix, etc. Sólo aquellos usuarios con privilegios de root pueden hacer uso de esta opción.

incrontab -f : nos permite indicarle un fichero de configuración. Por defecto usa /etc/incron.conf. En este fichero entre otras cosas personalzar el editor de texto usado cuando ejecutamos incrontab -e. También podemos cambiar la localización de los ficheros incron.allow, incron.deny, los directorios donde se almacenan las tablas de reglas, etc. Para más información: man incron.conf.

Caracteres especiales Estos caracteres los podemos usar como parámetros al comando que se ejecuta cuando se dispare un evento. Por ejemplo si estamos monitorizando la creación de ficheros en /tmp, con $# podemos saber el nombre del fichero que ha sido creado.

$$    símbolo del dolar. $@   path del fichero o directorio. $#   Nombre del fichero o directorio, sin el path. $%   nombre del evento que se disparó $&   número del evento que se disparó

Veamos algunos ejemplos:

Ejecuta incrontab -e añade la siguiente línea: /tmp IN_ALL_EVENTS echo “$@/$# $%” Ahora recargamos la nuestra tabla de reglasÑ incrontab -d A continuación creamos un fichero en /tmp touch /tmp/pp El comando echo manda la salida al log del sistema, por lo tanto hacemos: tail /var/log/syslog … Jan 30 16:27:02 laptop incrond[4136]: table for user tuxotron created, loading Jan 30 16:27:22 laptop incrond[4136]: table for user tuxotron changed, reloading Jan 30 16:27:30 laptop incrond[4136]: (tuxotron) CMD (echo “/tmp/pp IN_CREATE”) Jan 30 16:27:30 laptop incrond[4136]: (tuxotron) CMD (echo “/tmp/pp IN_OPEN”) Jan 30 16:27:30 laptop incrond[4136]: (tuxotron) CMD (echo “/tmp/pp IN_ATTRIB”) Jan 30 16:27:30 laptop incrond[4136]: (tuxotron) CMD (echo “/tmp/pp IN_CLOSE_WRITE”) … Este ejemplo monitoriza todos los eventos en el directorio /tmp y ejecuta el comando echo con el path completo (incluido el nombre del fichero) y el nombre del evento que se disparó.

Otros ejemplos: /usr/bin IN_ACCESS,IN_NO_LOOP abcd $# En este caso monitorizamos los accesos de lectura en /usr/bin. Le pasamos como argumento al comando abcd el nombre del fichero al cual se ha accedido y además se deshabilita la monitorización del evento en cuestion hasta que abcd termine su ejecución.

/home IN_CREATE /usr/local/bin/abcd $# Con esta regla monitorizamos la creción de ficheros o directorios en el /home. Básicamente, esto es, cada vez que se cree un nuevo usuario en el sistema.

/etc/apache2/apache2.conf IN_MODIFY /etc/init.d/apache2 restart Ahora queremos que cada vez que se modifique el ficheros de configuración de apache, se reinicie el servidor de apache y así hacer efectivo los cambios.

Como podéis ver las opciones son infinitas. Ya para acabar, comentar que existen  2 tipos de tablas de reglas. Las de usuario y las del sistema. Las tablas de reglas de usuarios, son creadas como su nombre indica por los propios usuarios y son almacenadas por defecto en /var/spool/incron. La tabla de reglas del sistema con creadas normalmente por el usuario root y ejecutan alguna tarea del sistema. Estas tablas se almacenan en /etc/incron.d. Estos directorios, pueden ser modificados en el dichero /etc/incron.conf.

Pues esto es todo, espero que se entienda lo escrito y que compartáis vuestras ideas de uso de incron.

Referencias:

http://inotify.aiken.cz/?section=inotify-cxx&page=doc&lang=en http://www.debian-administration.org/articles/581 http://www.howtoforge.com/triggering-commands-on-file-or-directory-changes-with-incron http://www.linux.com/feature/144666