Question

j'utilise Chien de garde Pour surveiller un répertoire réseau, non réécursif, pour un modèle spécifique de fichiers à créer au fil du temps. Le problème que je vois est que même si cela fonctionne fantastique lorsque je teste localement, si je modifie le répertoire surveillé à partir d'une machine distante, les événements ne sont pas déclenchés.

Voici les détails spécifiques de ma configuration:

  • OSX
  • Surveillance d'un seul répertoire, non réécursif, sur une monture NFS
  • Python 2.6

Un exemple de mon problème peut être facilement reproduit en utilisant l'exemple d'exemple de stock:

import sys
import time
import logging
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler

if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO,
                        format='%(asctime)s - %(message)s',
                        datefmt='%Y-%m-%d %H:%M:%S')
    event_handler = LoggingEventHandler()
    observer = Observer()
    observer.schedule(event_handler, path=sys.argv[1], recursive=False)
    observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

Si vous démarrez ceci sur un répertoire réseau, puis apportez des modifications du même système, les événements sont envoyés. Mais si vous apportez ensuite des modifications au répertoire à partir d'une autre machine sur le réseau, aucun événement n'est envoyé.

Est-ce que je manque quelque chose concernant les limitations de Kqueue (ou pourrait être FSevents sur OSX, car il dit qu'il est préféré d'abord par Watchdog)?

J'ai été ravi sur ce package Python et j'allais commencer à l'utiliser pour d'autres scripts pour remplacer le sondage du système de fichiers, mais je n'arrive pas à trouver d'informations sur les raisons pour lesquelles je vois ce problème.

Mise à jour

J'ai aussi testé Macfsevants et a eu le même problème. Ensuite, j'ai modifié le script de test ci-dessus pour essayer de force différents observateurs:

# does not work with remote changes
from watchdog.observers.fsevents import FSEventsObserver as Observer
# does not work with remote changes
from watchdog.observers.kqueue import KqueueObserver as Observer
# only option that works because its actually polling every second
from watchdog.observers.polling import PollingObserver as Observer

Donc, au moins pour l'instant, je peux utiliser l'observateur de sondage et ne pas avoir à modifier mon code, jusqu'à ce que quelqu'un puisse faire la lumière sur le vrai problème que j'ai.

Était-ce utile?

La solution

Je suis à peu près sûr que les événements du système de fichiers ne fonctionnent pas sur NFS - la raison étant que la façon dont le noyau gère normalement les événements du système de fichiers est qu'il a une couche dans le noyau qui déclenche l'activité - avec NFS, il n'y a pas d'installation pour notifier les modifications , vous ne pouvez obtenir qu'une liste d'Inodes, écrire des blocs, lire quelques blocs .. etc. C'est assez minime.

Pour que les événements de système de fichiers fonctionnent sur NFS, vous devrez être constamment interrogé le serveur NFS.

Il peut y avoir une installation pour cela avec AFP, qui si vous avez le jus que vous pouvez simplement installer netatalk Et essayez ça.

Si vous avez absolument besoin de faire quelque chose comme ça et que Netatalk ne le fait pas - votre meilleur pari est d'obtenir OSXFUSE opérationnel et d'écrire une superposition NFS qui est réellement restée là et d'interroger pour les modifications. Mais, vous serez limité à «tronqué, modifié, annexé, supprimé», etc.

Voir également: Utilisez libfuse dans un projet, sans accès root (pour l'installation)? Montures FTP et inotify / kqueue / fsevents

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top