J'ai un scénario où je télécharge des fichiers .csv dans un dossier spécifique,/tmp/data_upload, tous les jours, et les anciens fichiers sont remplacés par le nouveau.
J'ai besoin d'exécuter un script Python une fois les données téléchargées. Pour cela, j'ai une idée de créer un travail cron et de surveiller les modifications dans le fichier. J'ai essayé d'utiliser inotify, mais je suis pas beaucoup dans le domaine Unix. Comment faire?
J'ai besoin d'exécuter le script test.py une fois qu'il y a un changement de date d'un fichier dans le dossier de téléchargement, par exemple,/tmp/data_upload.
Vous pourriez avoir besoin d'incrond (démon cron inotify) qui surveillera les modifications sur les fichiers et exécutera ensuite les scripts.
Incrond peut surveiller ajouter de nouveaux fichiers, modifier, supprimer et bien d'autres. Ceci est un article montre quel événement incrond peut surveiller avec un exemple.
Exemple pour votre cas, vous pouvez créer le fichier /etc/incron.d/data_upload
avec le contenu
/tmp/data_upload IN_CREATE,IN_MODIFY /path/to/test.py
Vous pouvez utiliser entr pour exécuter automatiquement le script chaque fois qu'un fichier change en exécutant ls /tmp/data_upload | entr -p script.py
une fois au démarrage.
Site Web du projet: http://eradman.com/entrproject/
Page de manuel en ligne: https://www.systutorials.com/docs/linux/man/1-entr/
Mon approche générale serait de jouer avec l'utilitaire Unix find
classique. Par exemple, la commande
find /tmp/upload_data/*.csv -mtime -1 -exec /home/myname/test.py
trouvera tout .csv
fichiers dans /tmp/upload_data
qui ont été modifiés il y a moins d'un jour et exécutez votre test.py
s'il en trouve. Bien sûr, si votre test.py
le fichier se trouve dans un autre répertoire, vous souhaitez mettre à jour votre chemin d'accès en conséquence.
Si vous exécutez votre travail cron
plus d'une fois par jour, vous pouvez utiliser l'option mmin
pour find
pour spécifier la durée maximale depuis la modification en minutes. Par exemple,
find /tmp/upload_data/*.csv -mmin -60 -exec /home/myname/test.py
recherchera .csv
fichiers modifiés il y a moins de 60 minutes - utile si cron exécute le travail toutes les heures.
Deux avertissements justes sont en règle: tout d'abord, cela n'attrapera pas .csv
fichiers que vous avez entièrement supprimés. Vous voudrez peut-être les vérifier séparément. Deuxièmement, je n'ai pas eu le temps de tester tout cela. Attendez-vous à des fautes de frappe dans mon code que vous devrez déboguer par vous-même.
L'utilitaire de ligne de commande watchexec
( https://crates.io/crates/watchexec ) ressemble exactement à ce dont vous avez besoin, bien que je pense que pour l'installer, vous devez avoir le Rust build tools installé sur votre machine, ce qui peut être un dealbreaker