Skip to content

KQueue implementation tries to open each new file #1115

@UnitedMarsupials

Description

@UnitedMarsupials

The simple directory-watching script is below:

import logging
import sys
import time

from watchdog.events import FileSystemEventHandler
from watchdog.observers import Observer

class MyEventHandler(FileSystemEventHandler):
	def __init__(self, observer, log):
		self.log = log
		self.observer = observer

	def on_created(self, event):
		self.log.info("%s", event)

def main(argv):
	logging.basicConfig(format = '%(asctime)s %(levelname)-8s %(message)s',
	    datefmt = '%Y-%m-%d %H:%M:%S',
	    level = logging.DEBUG)
	log = logging.getLogger(__name__)
	path = argv[1]
	observer = Observer()
	log.debug('Created observer %s', observer)
	event_handler = MyEventHandler(observer, log)
	observer.schedule(event_handler, path, recursive = False)
	observer.start()
	observer.join()
	return 0

if __name__ == "__main__":
	sys.exit(main(sys.argv))

Started as something like ./fpounce.py /tmp it works, but the observer-thread crashes as soon as a file is created in the watched directory (/tmp) by some other user (such as the www):

2025-07-09 14:30:41 DEBUG    Created observer <KqueueObserver(Thread-1, initial daemon)>
2025-07-09 14:30:42 INFO     FileCreatedEvent(src_path='/tmp/sess_e645f55f69770d25a08b8210245510f6', dest_path='', event_type='created', is_directory=False, is_synthetic=False)
Exception in thread Thread-2:
Traceback (most recent call last):
  File "/opt/lib/python3.11/threading.py", line 1045, in _bootstrap_inner
    self.run()
  File "/opt/lib/python3.11/site-packages/watchdog/observers/api.py", line 158, in run
    self.queue_events(self.timeout)
  File "/opt/lib/python3.11/site-packages/watchdog/observers/kqueue.py", line 630, in queue_events
    self.queue_event(FileCreatedEvent(file_created))
  File "/opt/lib/python3.11/site-packages/watchdog/observers/kqueue.py", line 481, in queue_event
    self._register_kevent(event.src_path, is_directory=event.is_directory)
  File "/opt/lib/python3.11/site-packages/watchdog/observers/kqueue.py", line 435, in _register_kevent
    self._descriptors.add(path, is_directory=is_directory)
  File "/opt/lib/python3.11/site-packages/watchdog/observers/kqueue.py", line 215, in add
    self._add_descriptor(KeventDescriptor(path, is_directory=is_directory))
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/lib/python3.11/site-packages/watchdog/observers/kqueue.py", line 294, in __init__
    self._fd = os.open(path, WATCHDOG_OS_OPEN_FLAGS)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PermissionError: [Errno 13] Permission denied: '/tmp/sess_e645f55f69770d25a08b8210245510f6'

Why is it trying to open the newly-created files? Can I disable this somehow -- or make failures non-fatal?

This is on FreeBSD using python-3.11 and watchdog-6.0.0.

Testing the same code on Linux -- no problem there with python-3.6 and watchdog-2.1.9. The new files are duly reported and that's it.

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions