Esta guía muestra cómo puedes instalar y usar incron en un sistema Debian Etch. Incron es similar a cron, pero en lugar de ejecutar comandos basados en el tiempo, puede activar comandos cuando ocurren eventos de archivos o directorios (por ejemplo, una modificación de archivo, cambios de permisos, etc.).
¡Este documento se presenta sin garantía de ningún tipo! No emito ninguna garantía de que esto funcione para ti!
1 Instalando Incron
Incron está disponible en el repositorio etch-backports, así que tenemos que agregar la siguiente línea a /etc/apt/sources.list:
| [...] deb http://www.backports.org/debian etch-backports main contrib non-free [...] |
Importemos la clave del archivo backports.org en apt…
wget -O - http://backports.org/debian/archive.key | apt-key add -
… y ejecuta
El repositorio etch-backports está inactivo por defecto, así que para instalar incron desde él, debemos usar el siguiente comando:
apt-get -t etch-backports install incron
2 Usando Incron
El uso de incron es muy similar al uso de cron. Tienes el comando incrontab que te permite listar ( -l), editar ( -e) y eliminar ( -r) entradas de incrontab. Para aprender más sobre esto, consulta
Allí también encontrarás la siguiente sección:
Si /etc/incron.allow existe, solo los usuarios listados aquí pueden usar incron. De lo contrario, si /etc/incron.deny existe, solo los usuarios NO listados aquí pueden usar incron. Si ninguno de estos archivos existe, todos están permitidos a usar incron. (Nota importante: Este comportamiento no es seguro y probablemente se cambiará para ser compatible con el estilo usado por ISC Cron.) La ubicación de estos archivos puede ser cambiada en la configuración.
Esto significa que si queremos usar incrontab como root, debemos eliminar /etc/incron.allow (lo cual no es seguro porque entonces cada usuario del sistema puede usar incrontab)…
… o agregar root a ese archivo (recomendado):
| root |
Antes de hacer esto, recibirás mensajes de error como este al intentar usar incrontab:
server1:~# incrontab -l
user 'root' is not allowed to use incron
server1:~#
Después de esto funciona:
server1:~# incrontab -l
no table for root
server1:~#
Podemos usar
para crear trabajos de incron. Antes de hacer esto, echamos un vistazo a
porque explica el formato de los crontabs. Básicamente, el formato es el siguiente…
… donde puede ser un directorio (lo que significa que el directorio y/o los archivos directamente en ese directorio (¡no archivos en subdirectorios de ese directorio!) son vigilados) o un archivo.
puede ser uno de los siguientes:
```
IN_ACCESS Archivo fue accedido (leído) (*)
IN_ATTRIB Metadata cambiada (permisos, marcas de tiempo, atributos extendidos, etc.) (*)
IN_CLOSE_WRITE Archivo abierto para escritura fue cerrado (*)
IN_CLOSE_NOWRITE Archivo no abierto para escritura fue cerrado (*)
IN_CREATE Archivo/directorio creado en el directorio vigilado (*)
IN_DELETE Archivo/directorio eliminado del directorio vigilado (*)
IN_DELETE_SELF Archivo/directorio vigilado fue eliminado
IN_MODIFY Archivo fue modificado (*)
IN_MOVE_SELF Archivo/directorio vigilado fue movido
IN_MOVED_FROM Archivo movido fuera del directorio vigilado (*)
IN_MOVED_TO Archivo movido dentro del directorio vigilado (*)
IN_OPEN Archivo fue abierto (*))
```
Al monitorear un directorio, los eventos marcados con un asterisco (*) arriba pueden ocurrir para archivos en el directorio, en cuyo caso el campo de nombre en los datos de evento devueltos identifica el nombre del archivo dentro del directorio.
El símbolo IN_ALL_EVENTS se define como una máscara de bits de todos los eventos anteriores. Dos símbolos adicionales de conveniencia son IN_MOVE, que es una combinación de IN_MOVED_FROM e IN_MOVED_TO, e IN_CLOSE que combina IN_CLOSE_WRITE e IN_CLOSE_NOWRITE.
Los siguientes símbolos adicionales pueden ser especificados en la máscara:
```
IN_DONT_FOLLOW No desreferenciar la ruta si es un enlace simbólico
IN_ONESHOT Monitorear la ruta solo para un evento
IN_ONLYDIR Solo vigilar la ruta si es un directorio
```
Adicionalmente, hay un símbolo que no aparece en el conjunto de símbolos inotify. Es IN_NO_LOOP. Este símbolo desactiva la monitorización de eventos hasta que el actual sea completamente manejado (hasta que su proceso hijo salga).
es el comando que debe ejecutarse cuando ocurre el evento. Los siguientes comodines pueden ser usados dentro de la especificación del comando:
```
$$ signo de dólar
$@ ruta del sistema de archivos vigilado (ver arriba)
$# nombre del archivo relacionado con el evento
$% banderas del evento (textualmente)
$& banderas del evento (numéricamente)
```
Si vigilas un directorio, entonces $@ contiene la ruta del directorio y $# el archivo que activó el evento. Si vigilas un archivo, entonces $@ contiene la ruta completa al archivo y $# está vacío.
Si necesitas los comodines pero no estás seguro de a qué se traducen, puedes crear un trabajo de incron como este:
| ```
/tmp/ IN_MODIFY echo "$ $@ $# $% $&"
``` |
Luego creas o modificas un archivo en el directorio /tmp y echas un vistazo a /var/log/syslog - este registro muestra cuándo se activó un trabajo de incron, si tuvo éxito o si hubo errores, y cuál fue el comando real que ejecutó (es decir, los comodines son reemplazados por sus valores reales).
```
tail /var/log/syslog
```
```
...
Aug 21 17:26:50 server1 incrond[7111]: (root) CMD (echo "$ /tmp huhu IN_CREATE 256")
```
En este ejemplo he creado el archivo /tmp/huhu; como ves, $@ se traduce a /tmp, $# a huhu, $% a IN_CREATE, y $& a 256.
Ahora suficiente teoría. Vamos a crear nuestros primeros trabajos de incron. Me gustaría vigilar el archivo /etc/apache2/apache2.conf y el directorio /etc/apache2/vhosts/, y cada vez que haya cambios, quiero que incron reinicie Apache. Así es como lo hacemos:
```
incrontab -e
```
| ```
/etc/apache2/apache2.conf IN_MODIFY /etc/init.d/apache2 restart
/etc/apache2/vhosts/ IN_MODIFY /etc/init.d/apache2 restart
``` |
Eso es todo. Para fines de prueba, puedes modificar tu configuración de Apache y echar un vistazo a /var/log/syslog, y deberías ver que incron reinicia Apache.
Para listar todos los trabajos de incron definidos, puedes ejecutar
```
incrontab -l
```
```
server1:~# incrontab -l
/etc/apache2/apache2.conf IN_MODIFY /etc/init.d/apache2 restart
/etc/apache2/vhosts/ IN_MODIFY /etc/init.d/apache2 restart
server1:~#
```
Para eliminar todos los trabajos de incron del usuario actual, ejecuta
```
incrontab -r
```
```
server1:~# incrontab -r
removing table for user 'root'
table for user 'root' successfully removed
server1:~#
```
### 3 Enlaces
- incron: http://inotify.aiken.cz/?section=incron&page=about&lang=en