Donc, j'essaie de faire cette tâche un peu simple, mais je n'ai pas encore réussi. J'espère que cela change maintenant.
Exécutez /var/www/lager-scanner/filer/pluk_script.py
chaque fois qu'il y a un nouveau fichier dans /var/www/lager-scanner/filer/Nav/FromNav
et exécutez-le en tant qu'utilisateur www-data
.
Y a-t-il quelqu'un dehors qui peut me dire comment faire ça?
Tous les dossiers de /var/www
appartiennent à l'utilisateur et au groupe www-data
et disposent des autorisations 775
.
Pas une dupe, mais dans la réponse acceptée sur cette question , il est expliqué comment exécuter un script (ou toute commande) chaque fois qu'un fichier est ajouté ou créé dans un répertoire arbitraire. Dans votre cas, le seul événement déclencheur nécessaire est:
-e create
De plus, comme vous n'utilisez pas le chemin d'accès au fichier comme argument, vous pouvez ignorer la section --format
.
Le script à exécuter en arrière-plan est alors simplement:
#!/bin/bash
DIR="/var/www/lager-scanner/filer/Nav/FromNav"
inotifywait -m -r -e create "$DIR" | while read f
do
# you may want to release the monkey after the test :)
echo monkey
# <whatever_command_or_script_you_liketorun>
done
Comme expliqué dans la question liée:
-e create
remarquerez les nouveaux fichiers créés dans le répertoire.
Les options:
-m -r
doivent exécuter la commande indéfiniment ("moniteur") et de manière récursive dans le répertoire.
Selon this , utiliser pyinotify
n’est pas la meilleure option.
Dans un commentaire que vous mentionnez, cela ne fonctionne pas et vous indiquez que le dossier ciblé est distant. Bien que pas exactement identique, le problème semble lié à this :
la modification n'est pas visible par le noyau; cela se passe entièrement à distance.
Une solution (testée) consiste à monter le dossier distant localement.
Voici une version allégée de l'exemple de la page inotify sur PyPI
( https://pypi.python.org/pypi/inotify ) pour vous aider à démarrer:
import inotify.adapters
import os
notifier = inotify.adapters.Inotify()
notifier.add_watch('/home/student')
for event in notifier.event_gen():
if event is not None:
# print event # uncomment to see all events generated
if 'IN_CREATE' in event[1]:
print "file '{0}' created in '{1}'".format(event[3], event[2])
os.system("your_python_script_here.py")
Il crée un objet Inotify, puis ajoute un répertoire à surveiller à l'aide de la méthode add_watch (). Ensuite, il crée un générateur d'événements à partir de l'objet Inotify à l'aide de la méthode event_gen (). Enfin, il itère sur ce générateur
Désormais, les opérations sur les fichiers qui affectent le répertoire surveillé généreront un ou plusieurs événements. Chaque événement prend la forme d'un tuple avec quatre valeurs:
L'exécution de l'exemple ci-dessus avec la première instruction print non commentée, puis la création du fichier 'new' dans le répertoire surveillé donne cette sortie:
((...), ['IN_CREATE'], '/ home/étudiant', 'nouveau') Fichier 'nouveau' créé dans '/home/student' ((...), ['IN_ISDIR', 'IN_OPEN'], '/ home/étudiant', '') ((...), ['IN_ISDIR', 'IN_CLOSE_NOWRITE'/home/student ',' ') ((...), [' IN_OPEN '],'/home/student ',' new ') ((...), [' IN_ATTRIB '],'/home/student ',' new ') ((...), [' IN_CLOSE_WRITE '],'/home/student ',' new ')
Étant donné que l'événement 'IN_CREATE' se produit lors de la création d'un nouveau fichier, vous pouvez ajouter le code que vous souhaitez exécuter.