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.
inotify
bibliotecas disponibles. Vea una de mis respuestas aquí para ver un ejemplo: askubuntu.com/a/939392/295286Respuestas:
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_upload
con el contenidofuente
incrontab -e
como 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?Puede usar entr para ejecutar automáticamente el script cada vez que cambia un archivo ejecutándose
ls /tmp/data_upload | entr -p script.py
una vez al inicio.Sitio web del proyecto: http://eradman.com/entrproject/
Página de manual en línea: https://www.systutorials.com/docs/linux/man/1-entr/
fuente
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 decisivofuente
Mi enfoque general sería jugar con la clásica
find
utilidad de Unix . Por ejemplo, el comandoencontrará cualquier
.csv
archivo/tmp/upload_data
que haya sido modificado hace menos de un día, y ejecutará sutest.py
si encuentra alguno. Por supuesto, si sutest.py
archivo está en algún otro directorio, desea actualizar su ruta en consecuencia.Si ejecuta su
cron
trabajo más de una vez al día, puede usar lammin
opciónfind
para especificar el tiempo máximo desde la modificación en minutos. Por ejemplo,buscará
.csv
archivos 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á
.csv
archivos 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.fuente
-cmd
sintaxis? IIRCfind
toma-exec cmd ;
...