Exécuter la commande lorsqu'un fichier change

9

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 changements dans le fichier. J'ai essayé d'utiliser inotify, mais je ne suis pas beaucoup dans le domaine Unix. Comment puis je faire ça?

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.

Alex
la source
Avez-vous consulté eradman.com/entrproject , je ne l'ai pas essayé moi-même, mais il semble que cela puisse être lié.
OO
Pour info, Python a des inotifybibliothèques disponibles. Voir une de mes réponses ici pour un exemple: askubuntu.com/a/939392/295286
Sergiy Kolodyazhnyy

Réponses:

10

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. Cet 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_uploadavec le contenu

/tmp/data_upload IN_CREATE,IN_MODIFY /path/to/test.py 
victoroloan
la source
2
Bien que cela puisse théoriquement répondre à la question, il serait préférable d'inclure ici les parties essentielles de la réponse et de fournir le lien de référence.
Gerald Schneider
Merci de me l'avoir rappelé, j'ai ajouté le contexte du lien.
victoroloan
Merci pour la réponse, juste pour vérifier les étapes après avoir installé incrontab shoudl exécuter en incrontab -etant que root puis inclure cette ligne /tmp/data_upload IN_CREATE,IN_MODIFY test.py ? de sorte que pour vérifier une fois que je télécharge un nouveau fichier, il doit exécuter le fichier test.py? où dois-je placer le fichier test.py? dois-je avoir besoin de fournir un chemin absolu pour cela?
Alex
1
Je pense, il vaudra mieux mettre le chemin absolu pour votre script. Vous pouvez également consulter cron ou le journal système si le script ne semble pas fonctionner
victoroloan
Pouvez-vous également documenter le fichier auquel vous faites référence avec votre bloc de code, les personnes qui ne connaissent pas la syntaxe d'Incrond (comme moi) peuvent penser faire référence à une commande que vous devez exécuter sur la ligne de commande
Ferrybig
0

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 installé les outils de construction Rust sur votre machine, ce qui peut être un dealbreaker

Ben Sandeen
la source
1
J'adore utiliser un logiciel écrit en rouille parce que vous savez qu'il n'a pas été abandonné en 2004 ou quelque chose comme ça. Cela doit presque être nouveau.
Nathaniel Pisarski
0

Mon approche générale serait de jouer avec l' findutilitaire Unix classique . Par exemple, la commande

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

trouvera tous les .csvfichiers /tmp/upload_dataqui ont été modifiés il y a moins d'un jour et exécutera votre test.pys'il en trouve. Bien sûr, si votre test.pyfichier se trouve dans un autre répertoire, vous souhaitez mettre à jour votre chemin d'accès en conséquence.

Si vous exécutez votre crontravail plus d'une fois par jour, vous pouvez utiliser l' mminoption findpour 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 les .csvfichiers qui ont été modifiés il y a moins de 60 minutes - utile si cron exécute le travail toutes les heures.

Deux avertissements équitables sont en règle: Premièrement, cela n'attrapera pas les .csvfichiers 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.

Thomas Blankenhorn
la source
1
Quelle est la -cmdsyntaxe? L'IIRC findprend -exec cmd ;...
D. Ben Knoble
J'ai essayé celui-ci avant de poster cette question, cela ne fonctionne pas correctement lors de la 2ème 3ème série consécutive de tâches cron
Alex
@RÉ. Ben Knoble: Vous avez raison. J'ai mélangé les commandes find-internal avec les commandes shell. Fixé. Merci pour la correction!
Thomas Blankenhorn