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.
inotify
bibliothèques disponibles. Voir une de mes réponses ici pour un exemple: askubuntu.com/a/939392/295286Réponses:
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_upload
avec le contenula source
incrontab -e
tant 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?Vous pouvez utiliser entr pour exécuter automatiquement le script chaque fois qu'un fichier change en s'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/
la source
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 dealbreakerla source
Mon approche générale serait de jouer avec l'
find
utilitaire Unix classique . Par exemple, la commandetrouvera tous les
.csv
fichiers/tmp/upload_data
qui ont été modifiés il y a moins d'un jour et exécutera votretest.py
s'il en trouve. Bien sûr, si votretest.py
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
cron
travail plus d'une fois par jour, vous pouvez utiliser l'mmin
optionfind
pour spécifier la durée maximale depuis la modification en minutes. Par exemple,recherchera les
.csv
fichiers 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
.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.la source
-cmd
syntaxe? L'IIRCfind
prend-exec cmd ;
...