web-dev-qa-db-fra.com

Comment exécuter un script python lorsqu'un fichier est créé dans un répertoire?

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.

Le but:

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.

4
Folkmann

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

Explication

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.

MODIFIER

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.

4
Jacob Vlijm

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:

  • Un tuple _INOTIFY_EVENT (omis dans la sortie ci-dessous pour plus de clarté)
  • Une liste de chaînes décrivant les événements
  • Le nom du répertoire concerné
  • Le nom du fichier concerné

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.

1
quizdog