Pregunta

Tengo un problema con pyinotify: los métodos process_*() del ProcessEvent no se llaman

El código

import sys, time, syslog
from pyinotify import WatchManager, Notifier, ThreadedNotifier, ProcessEvent, EventsCodes
from daemon import Daemon


class PTmp(ProcessEvent):
    def process_IN_CREATE(self, event):
        syslog.syslog("creating: " + event.pathname)
    def process_IN_DELETE(self, event):
        syslog.syslog("creating: " + event.pathname)
    def process_default(self, event):
        syslog.syslog("default: " + event.pathname)

class MyDaemon(Daemon):
    def run(self):
        syslog.openlog('archmind',syslog.LOG_PID,syslog.LOG_DAEMON)
        syslog.syslog('daemon started, entering loop')
        wm = WatchManager()
        mask = IN_DELETE | IN_CREATE
        notifier = ThreadedNotifier(wm, PTmp())
        notifier.start()
        wdd = wm.add_watch('/tmp', mask, rec=True)
        while True:
            time.sleep(1)
        wm.rm_watch(wdd.values())
        notifier.stop()
        syslog.syslog('exiting loop')
        syslog.closelog()

if __name__ == "__main__":
    daemon = MyDaemon('/tmp/archmind.pid')
    if len(sys.argv) == 2:
        if 'start' == sys.argv[1]:
            daemon.start()
        elif 'stop' == sys.argv[1]:
            daemon.stop()
        elif 'restart' == sys.argv[1]:
            daemon.restart()
        else:
            print "Unknown command"
            sys.exit(2)
        sys.exit(0)
    else:
        print "usage: %s start|stop|restart" % sys.argv[0]
        sys.exit(2)

Todo lo demás está registrado. Inofity funciona correctamente, lo he probado con inotifywait. ¿Qué puedo estar perdiendo?

¿Fue útil?

Solución

Al problema le faltaba la importación de In_*, que debe hacerse manualmente. Lo he descubierto después de llamar

daemon.run()

en vez de

daemon.start()

haciendo que el guión se ejecute en primer plano.

Otros consejos

Las máscaras se definen en los códigos de eventos.

 mask = EventsCodes.ALL_FLAGS['IN_DELETE']
 mask = EventsCodes.ALL_FLAGS['ALL_EVENTS']
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top