2011-09-27 21 views

Respuesta

25

Inotify es un módulo kernel accesible a través de llamadas desde, por ejemplo, un programa C http://www.ibm.com/developerworks/linux/library/l-ubuntu-inotify/

Hay un conjunto de aplicaciones llamada inotify-herramientas, que contiene:

inotifywait - esperar a cambios en los archivos usando inotify

http://linux.die.net/man/1/inotifywait

y

inotifywatch - recopilar estadísticas de acceso de sistema de archivos utilizando inotify

http://linux.die.net/man/1/inotifywatch

Puede utilizar inotify directamente desde la línea de comandos, por ejemplo, como este para monitorear de forma continua durante todos los cambios en el directorio inicial (puede generar gran cantidad de salida):

inotifywait -r -m $HOME 

Y aquí es un script que monitorea continuamente y reacciona a la actividad de registro de Apache, copiado del archivo de hombre de inotifywait:

#!/bin/sh 
while inotifywait -e modify /var/log/messages; do 
    if tail -n1 /var/log/messages | grep httpd; then 
    kdialog --msgbox "Apache needs love!" 
    fi 
done 
+10

El ejemplo proporcionado en realidad no monitorea "continuamente" como se indica en la pregunta. Sale en el primer evento. En la práctica, algunos eventos pueden pasarse por alto mientras se está ejecutando la parte interna del 'do'. – Unode

+2

No solo se pueden perder como lo dijo @Unode, sino que la inicialización tiene lugar cada vez que ocurre un cambio, por lo que no es un método eficiente. – Wernight

+0

Para aclarar, los comentarios de @Unode y Wernight se aplican solo al último ejemplo en la publicación (la secuencia de comandos para reaccionar a los eventos de registro de Apache). – depquid

11

A continuación se muestra lo que uso para ver las operaciones en un archivo individual. "-m" causa monitoreo vs. salida después de solo un evento. Para obtener marcas de tiempo, necesita al menos la versión 3.13 de inotify-tools, pero si eso no es importante (o no está disponible en su sistema operativo o es difícil actualizarlo) puede omitir las opciones timefmt y format. "/etc/resolv.conf gato" en la otra línea de comandos conduce a los resultados siguientes:

$ inotifywait -m --timefmt '%H:%M' --format '%T %w %e %f' /etc/resolv.conf 

Setting up watches. 
Watches established. 
12:49 /etc/resolv.conf OPEN 
12:49 /etc/resolv.conf ACCESS 
12:49 /etc/resolv.conf CLOSE_NOWRITE,CLOSE 

inotifywait tiene opciones para el seguimiento de directorios, así, a fin de comprobar la página de manual. Add -r para recursivo para supervisar hijos de un directorio.

He aquí un ejemplo con los comandos que he escrito en una ventana diferente se muestra con "->" prefijo:

$ inotifywait -mr --timefmt '%H:%M' --format '%T %w %e %f' /home/acarwile/tmpdir 
Setting up watches. Beware: since -r was given, this may take a while! 
Watches established. 

-> cd into directory, no info 
-> ls in directory 
13:15 /home/acarwile/tmpdir/ OPEN,ISDIR 
13:15 /home/acarwile/tmpdir/ CLOSE_NOWRITE,CLOSE,ISDIR 

-> touch newfile 
13:16 /home/acarwile/tmpdir/ CREATE newfile 
13:16 /home/acarwile/tmpdir/ OPEN newfile 
13:16 /home/acarwile/tmpdir/ ATTRIB newfile 
13:16 /home/acarwile/tmpdir/ CLOSE_WRITE,CLOSE newfile 

-> mv newfile renamedfile 
13:16 /home/acarwile/tmpdir/ MOVED_FROM newfile 
13:16 /home/acarwile/tmpdir/ MOVED_TO renamedfile 

-> echo hello >renamedfile 
13:16 /home/acarwile/tmpdir/ MODIFY renamedfile 
13:16 /home/acarwile/tmpdir/ OPEN renamedfile 
13:16 /home/acarwile/tmpdir/ MODIFY renamedfile 
13:16 /home/acarwile/tmpdir/ CLOSE_WRITE,CLOSE renamedfile 

-> touch renamedfile 
13:17 /home/acarwile/tmpdir/ OPEN renamedfile 
13:17 /home/acarwile/tmpdir/ ATTRIB renamedfile 
13:17 /home/acarwile/tmpdir/ CLOSE_WRITE,CLOSE renamedfile 

-> rm renamedfile 
13:17 /home/acarwile/tmpdir/ DELETE renamedfile 

-> cd ..; rmdir tmpdir 
13:17 /home/acarwile/tmpdir/ DELETE_SELF 

Después de lo anterior, he tratado de rehacer el tmpdir ("mkdir tmpdir") pero no obtuve salida de eso. El nuevo tmpdir no es el mismo directorio que el antiguo tmpdir. El tiempo para simplemente^C y detenerlo no permite esperar.

2

Como dije en https://superuser.com/a/747574/28782, he hecho un script de ayuda que utiliza inotifywait sin algunas de sus limitaciones directas: inotifyexec

Ejemplo de uso (suponiendo que haya añadido en la ruta del sistema como ejecutable):

inotifyexec "echo test" -r . 
Cuestiones relacionadas