Quiero ejecutar automáticamente un script cada vez que se copian nuevos archivos en un directorio en particular. En otras palabras, ¿hay alguna manera en Linux de "mirar" un directorio para detectar cambios y luego ejecutar algo en respuesta al cambio?
17
Respuestas:
Si tienes la suerte de estar en una distribución basada en Debian,
apt-get install dnotify
. Probablemente otras distribuciones tengan algo similar: busque eldnotify
nombre.Si desea manejar esto dentro de su propio programa, dnotify es también la API que desea usar.
fuente
emerge inotify-tools
Puede ejecutar un script con las herramientas de inotify, algo como esto. Observará el directorio en busca de cambios en archivos modificados, archivos nuevos y archivos eliminados, luego ejecutará el script.
fuente
incron es básicamente lo que quieres, creo. Utiliza inotify como mecanismo de notificación (que, como otros han señalado, reemplaza a dnotify), pero no requiere un script que se ejecute continuamente, usando inotifywait o similar (aunque, obviamente, el demonio incron se ejecuta todo el tiempo). Los 'crontabs' de todo el sistema y los 'crontabs' de usuario son compatibles de manera similar al cron estándar, pero en lugar de especificar los tiempos como desencadenantes, se utilizan eventos de notificación y nombres de archivos / directorios.
incron está empaquetado para muchas distribuciones, incluidas Ubuntu y Debian, creo.
fuente
Hay una pieza de software únicamente para este propósito, autoenv Es posible que desee verificarlo.
fuente
entr es la herramienta de notificación de archivos más simple y composable que he visto. Su uso está optimizado para mirar archivos en lugar de directorios, pero también puede resolver su caso.
Para detectar y actuar sobre el archivo agregado, combínelo con otras herramientas como por ejemplo
make
.entr
no envía el nombre ni nada de eso, simplemente ejecuta lo que le dijiste que ejecutara.Para buscar archivos agregados en un directorio:
Si también desea actuar cuando cambia un archivo existente:
... y ahí es donde el mecanismo de bucle es útil, ya que la
find
expresión se ejecutará nuevamente si se agrega un archivo.Si desea un mejor manejo de errores y quiere asegurarse de que las cosas solo se ejecuten una vez por archivo agregado / eliminado, las cosas se ponen un poco extrañas, pero para estos casos simples es genial.
EDITAR: si desea hacer esto a nivel de sistema, algo como incron , simplemente agregue el script a su administrador de procesos favorito (como s6 , runit , systemd o sysvinit y omita el ciclo:
La
exec
y la sustitución del proceso (<(...)
) son importantes cuando se ejecuta desde un administrador de procesos, para manejar la señalización correctamente (es decir, para sacar el shell del camino).fuente