web-dev-qa-db-fra.com

Exécuter la commande lorsqu'un fichier change

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.

9
Alex

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 
10
victoroloan

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/

1
jln-ho

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.

0
Thomas Blankenhorn

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

0
Ben Sandeen