Je veux exécuter automatiquement un script chaque fois que de nouveaux fichiers sont copiés dans un répertoire particulier. En d'autres termes, y a-t-il un moyen sous Linux de "surveiller" un répertoire pour les changements, puis d'exécuter quelque chose en réponse au changement?
17
Réponses:
Si vous êtes assez chanceux d'être sur une distribution basée sur Debian,
apt-get install dnotify
. D'autres distributions ont probablement quelque chose de similaire - recherchez lednotify
nom.Si vous souhaitez gérer cela dans votre propre programme, dnotify est également l'API que vous souhaitez utiliser.
la source
emerge inotify-tools
Vous pouvez exécuter un script avec les outils inotify, quelque chose comme ça. Il surveillera le répertoire pour les changements dans les fichiers modifiés, les nouveaux fichiers et les fichiers supprimés, puis exécutera le script.
la source
l'incron est fondamentalement ce que vous voulez, je pense. Il utilise inotify comme mécanisme de notification (qui, comme d'autres l'ont souligné, remplace dnotify), mais ne nécessite pas de script qui s'exécute en continu, en utilisant inotifywait ou similaire (bien que, évidemment, le démon incron fonctionne tout le temps). Les «crontabs» à l'échelle du système et les «crontabs» utilisateur sont pris en charge de la même manière que les cron standard, mais plutôt que de spécifier des heures comme déclencheurs, des événements inotify et des noms de fichiers / répertoires sont utilisés.
incron est packagé pour de nombreuses distributions, y compris Ubuntu et Debian, je crois.
la source
Il existe un logiciel uniquement à cette fin, autoenv Vous voudrez peut-être le vérifier.
la source
entr est l'outil de notification de fichiers le plus simple et le plus composable que j'ai vu. Son utilisation est optimisée pour regarder des fichiers plutôt que des répertoires, mais elle peut également résoudre votre cas.
Pour détecter et agir sur le fichier ajouté, combinez-le avec d'autres outils comme par exemple
make
.entr
n'envoie pas le nom ou quelque chose comme ça, il exécute simplement ce que vous lui avez dit d'exécuter.Pour vérifier les fichiers ajoutés dans un répertoire:
Si vous souhaitez également agir lorsqu'un fichier existant change:
... et c'est là que le mécanisme de boucle est utile, car l'
find
expression s'exécutera à nouveau si un fichier est ajouté.Si vous voulez une meilleure gestion des erreurs et que vous voulez vous assurer que les choses ne s'exécutent qu'une fois par fichier ajouté / supprimé, les choses deviennent un peu bizarres, mais pour ces cas simples, c'est génial.
EDIT: Si vous voulez faire cela au niveau du système, quelque chose comme incron , ajoutez simplement le script à votre gestionnaire de processus préféré (comme s6 , runit , systemd ou sysvinit et sautez la boucle:
Le
exec
et la substitution de processus (<(...)
) sont importants lors de l'exécution à partir d'un gestionnaire de processus, pour gérer correctement la signalisation (c'est-à-dire pour éloigner le shell).la source