pyinotify.threadednotifier, process_* no llamado
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?
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