2012-09-04 15 views
13

¿Hay una solución simple (utilizando utilidades de shell comunes, a través de una utilidad proporcionada por la mayoría de las distribuciones, o algún script simple de python/...) para reiniciar un proceso cuando cambian algunos archivos?Proceso de reinicio en el cambio de archivos en Linux

Sería bueno simplemente llamar algo así como watch -cmd "./the_process -arg" deps/*.

Actualización: Un simple script de shell junto con los inotify-herramientas propuestas adaptarse a mis necesidades (que funciona para comandos w/o argumentos) (agradable!):

#!/bin/sh 
while true; do 
    [email protected] & 
    PID=$! 
    inotifywait $1 
    kill $PID 
done 
+0

¿Alguien puede explicar qué significa "$!" por favor (no pude encontrarlo con Google), gracias. – Lior

+1

Devuelve la identificación del proceso iniciado anteriormente – Christian

+1

Si un sistema de archivos no tiene el atributo 'noatime', entonces la secuencia de comandos/proceso de destino se reiniciará en un bucle infinito debido al evento' access'. Para solucionarlo, utilice 'inotifywait -e modify $ 1' en su lugar, que solo reaccionará a los eventos de modificación de archivos. – chronos

Respuesta

11

Sí, se puede ver una directorio a través del sistema inotify usando inotifywait o inotifywatch del inotify-tools.

inotifywait saldrá al detectar un evento. Pase la opción -r para ver los directorios recursivamente. Ejemplo: inotifywait -r mydirectory.

También puede especificar el evento para ver en lugar de ver todos los eventos. Para esperar solo cambios de contenido de archivos o directorios, use la opción -e modify.

+0

¿Puedes dar un ejemplo? – Jon

+1

@Jon He agregado un ejemplo para 'inotifywait' que parece ser más adecuado para esta tarea que' inotifywatch'. – scai

7

Salida iWatch:

Watch es un programa de monitoreo del sistema de archivos en tiempo real. Es una herramienta para detectar cambios en el sistema de archivos y reportarlo de inmediato. Utiliza un archivo de configuración simple en formato XML y se basa en inotify, un sistema de notificación de cambio de archivos en el kernel de Linux.

que, se podía ver fácilmente archivos:

iwatch /path/to/file -c 'run_you_script.sh' 
+0

Quizás esta es incluso la mejor respuesta, pero prefiero la solución de bricolaje usando las herramientas de inotify. – Christian

5

Esta es una mejora en la respuesta dada en la pregunta. Cuando uno interrumpe el script, el proceso de ejecución debe ser eliminado.

#!/bin/sh 

sigint_handler() 
{ 
    kill $PID 
    exit 
} 

trap sigint_handler SIGINT 

while true; do 
    [email protected] & 
    PID=$! 
    inotifywait -e modify -e move -e create -e delete -e attrib -r `pwd` 
    kill $PID 
done 
+1

¡Gracias! Tenga en cuenta que debe agregar '-e attrib' si desea' touch somefile' para desencadenar un reinicio. – seanf

Cuestiones relacionadas