Ejecutar comando cuando un archivo cambia

9

Tengo un escenario en el que estoy cargando archivos .csv a una carpeta específica, / tmp / data_upload, todos los días, y los archivos antiguos se reemplazan por uno nuevo.

Necesito ejecutar un script Python una vez que se cargan los datos. Para esto, tengo la idea de crear un trabajo cron y monitorear los cambios en el archivo. Intenté usar inotify, pero no estoy muy interesado en el dominio de Unix. ¿Cómo puedo hacer eso?

Necesito ejecutar el script test.py una vez que hay un cambio de fecha de un archivo en la carpeta de carga, por ejemplo, / tmp / data_upload.

Alex
fuente
¿Has mirado en eradman.com/entrproject , no lo he probado yo mismo pero parece que puede estar relacionado?
OO
Para su información, Python tiene inotifybibliotecas disponibles. Vea una de mis respuestas aquí para ver un ejemplo: askubuntu.com/a/939392/295286
Sergiy Kolodyazhnyy

Respuestas:

10

Es posible que necesite incrond (inotify cron daemon) que supervisará los cambios en los archivos y luego ejecutará los scripts.

Incrond puede monitorear agregar nuevos archivos, modificar, eliminar y muchos más. Este es un artículo que muestra qué evento incrond puede monitorear con algún ejemplo.

Ejemplo para su caso, puede crear el archivo /etc/incron.d/data_uploadcon el contenido

/tmp/data_upload IN_CREATE,IN_MODIFY /path/to/test.py 
victoroloan
fuente
2
Si bien esto puede responder teóricamente la pregunta, sería preferible incluir aquí las partes esenciales de la respuesta y proporcionar el enlace para referencia.
Gerald Schneider
Gracias por recordarme, he agregado el contexto para el enlace.
victoroloan
Gracias por la respuesta, solo para verificar los pasos después de instalar incrontab shoudl ejecutar incrontab -ecomo root y luego incluir esta línea /tmp/data_upload IN_CREATE,IN_MODIFY test.py . para verificar una vez que cargue un nuevo archivo, ¿debería ejecutar el archivo test.py? ¿Dónde debo colocar el archivo test.py? ¿Debería proporcionar una ruta absoluta para esto?
Alex
1
Creo que será mejor poner el camino absoluto para tu script. También puede verificar cron o el registro del sistema si el script parece no funcionar
victoroloan
¿Puede documentar también a qué archivo se refiere con su bloque de código? Las personas que no están familiarizadas con la sintaxis de Incrond (como yo) pueden pensar que se refieren a un comando que debe ejecutar en la línea de comando
Ferrybig
0

La utilidad de línea de comandos watchexec( https://crates.io/crates/watchexec ) suena exactamente como lo que necesita, aunque creo que para instalarlo necesitaría tener las herramientas de compilación Rust instaladas en su máquina, por lo que puede ser un factor decisivo

Ben Sandeen
fuente
1
Me encanta usar software escrito en óxido porque sabes que no fue abandonado en 2004 o algo así. Casi tiene que ser nuevo.
Nathaniel Pisarski el
0

Mi enfoque general sería jugar con la clásica findutilidad de Unix . Por ejemplo, el comando

find /tmp/upload_data/*.csv -mtime -1 -exec /home/myname/test.py

encontrará cualquier .csvarchivo /tmp/upload_dataque haya sido modificado hace menos de un día, y ejecutará su test.pysi encuentra alguno. Por supuesto, si su test.pyarchivo está en algún otro directorio, desea actualizar su ruta en consecuencia.

Si ejecuta su crontrabajo más de una vez al día, puede usar la mminopción findpara especificar el tiempo máximo desde la modificación en minutos. Por ejemplo,

find /tmp/upload_data/*.csv -mmin -60 -exec /home/myname/test.py

buscará .csvarchivos que se modificaron hace menos de 60 minutos, útil si cron ejecuta el trabajo cada hora.

Dos advertencias justas están en orden: Primero, esto no capturará .csvarchivos que haya eliminado por completo. Es posible que desee verificar estos por separado. Segundo, no tuve tiempo de probar nada de esto. Espere errores tipográficos en mi código que tendrá que depurar usted mismo.

Thomas Blankenhorn
fuente
1
¿Cuál es la -cmdsintaxis? IIRC findtoma -exec cmd ;...
D. Ben Knoble
He intentado este antes de publicar esta pregunta, esto no funciona correctamente en la 2da 3ra ejecución consecutiva de trabajos cron
Alex
@RE. Ben Knoble: Tienes razón. Mezclé comandos de búsqueda interna con comandos de shell. Fijo. ¡Gracias por la corrección!
Thomas Blankenhorn