Watchdog: Uncatchable OSError: Permission Denied

Созданный на 10 окт. 2011  ·  6Комментарии  ·  Источник: gorakhargosh/watchdog

Привет,

Я использую сторожевой таймер для отслеживания новых файлов в файловой системе и запуска их автоматической обработки. Что происходит, так это то, что поток не имеет доступа к определенным файлам и вылетает. Есть ли способ предоставить сторожевому псу обработчик ошибок? Или чтобы он продолжал следить за другими файлами?

Ниже приведен пример трассировки.

Эрнан

  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 530, in **bootstrap_inner
    self.run()
  File "/Users/X/Documents/code/envs/Y/lib/python2.7/site-packages/watchdog/observers/api.py", line 192, in run
    self.queue_events(self.timeout)
  File "/Users/X/Documents/code/envs/Y/lib/python2.7/site-packages/watchdog/observers/kqueue.py", line 703, in queue_events
    new_snapshot)
  File "/Users/X/Documents/code/envs/Y/lib/python2.7/site-packages/watchdog/observers/kqueue.py", line 548, in _queue_dirs_modified
    self.queue_event(DirCreatedEvent(directory_created))
  File "/Users/X/Documents/code/envs/Y/lib/python2.7/site-packages/watchdog/observers/kqueue.py", line 520, in queue_event
    self._register_kevent(event.src_path, event.is_directory)
  File "/Users/X/Documents/code/envs/Y/lib/python2.7/site-packages/watchdog/observers/kqueue.py", line 470, in _register_kevent
    self._descriptors.add(path, is_directory)
  File "/Users/X/Documents/code/envs/Y/lib/python2.7/site-packages/watchdog/observers/kqueue.py", line 257, in add
    self._add_descriptor(KeventDescriptor(path, is_directory))
  File "/Users/X/Documents/code/envs/Y/lib/python2.7/site-packages/watchdog/observers/kqueue.py", line 342, in __init**
    self._fd = os.open(path, WATCHDOG_OS_OPEN_FLAGS)
OSError: [Errno 13] Permission denied: '/Users/X/Public/Y/FOLDER'

Самый полезный комментарий

Итак, эта проблема открыта с 2011 года. Владелец репо больше не поддерживает Watchdog? Я тоже только что столкнулся с этим.

Прокомментируйте, @gorakhargosh

Все 6 Комментарий

Это также влияет на inotify, когда он впервые пытается настроить наблюдение за каталогом, который, как правило, содержит подкаталоги, которые не доступны для чтения / списка.

Я также получаю эту ошибку, используя inotify для просмотра каталога, который включает глубоко вложенный подкаталог, для чтения которого у меня нет прав:

Traceback (most recent call last):
  File "./manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 399, in execute_from_command_line
    utility.execute()
  File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 392, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/djsupervisor/management/commands/supervisor.py", line 163, in run_from_argv
    return super(Command,self).run_from_argv(argv)
  File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/django/core/management/base.py", line 242, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/django/core/management/base.py", line 285, in execute
    output = self.handle(*args, **options)
  File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/djsupervisor/management/commands/supervisor.py", line 186, in handle
    return method(cfg_file,*args[1:],**options)
  File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/djsupervisor/management/commands/supervisor.py", line 264, in _handle_autoreload
    observer.start()
  File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/watchdog/observers/api.py", line 255, in start
    emitter.start()
  File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/watchdog/utils/__init__.py", line 111, in start
    self.on_thread_start()
  File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/watchdog/observers/inotify.py", line 121, in on_thread_start
    self._inotify = InotifyBuffer(path, self.watch.is_recursive)
  File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/watchdog/observers/inotify_buffer.py", line 35, in __init__
    self._inotify = Inotify(path, recursive)
  File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/watchdog/observers/inotify_c.py", line 187, in __init__
    self._add_dir_watch(path, recursive, event_mask)
  File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/watchdog/observers/inotify_c.py", line 371, in _add_dir_watch
    self._add_watch(full_path, mask)
  File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/watchdog/observers/inotify_c.py", line 385, in _add_watch
    Inotify._raise_error()
  File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/watchdog/observers/inotify_c.py", line 406, in _raise_error
    raise OSError(os.strerror(err))
OSError: Permission denied

Итак, эта проблема открыта с 2011 года. Владелец репо больше не поддерживает Watchdog? Я тоже только что столкнулся с этим.

Прокомментируйте, @gorakhargosh

Ого, этот выпуск довольно старый!

[...] Есть ли способ предоставить сторожевому псу обработчик ошибок? Или чтобы он продолжал следить за другими файлами?

На данный момент лучшее, что вы можете сделать, - это запланировать нерекурсивный наблюдатель.

Это что-то довольно разбросанное в коде, и это одновременно проблема обработки времени создания наблюдателя и проблема обработки эмиттера , поскольку запрещенный доступ может произойти в любое время (с помощью chmod , chown или инструментов SELinux ). У вас есть идеи, как это можно исправить в API (кроме грязного взлома)?

Возможно, errno.EACCES (который напоминает мне # 459) должен обрабатываться по умолчанию с выдачей некоторого предупреждения, чтобы не запрещать просмотр оставшихся каталогов. Но этого кажется недостаточно для решения этой проблемы.

Это делает практически любой вариант использования, когда есть несколько пользователей, непригодными для использования. Другое событие, которое не работает ... у пользователя есть каталог, для которого он составляет 700, они копируют каталог в наблюдаемое дерево. Вылетать не будет, просто выдаст ошибку. chmod 755, так что теперь сторожевой процесс может читать все файлы в дереве. это не так.

возможно, просто сделать какую-то ошибку os дополнительным событием? пользователь может просто решить, что с ним делать.
это, вероятно, было бы самым чистым.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

datakurre picture datakurre  ·  7Комментарии

mccarthyryanc picture mccarthyryanc  ·  5Комментарии

Naatan picture Naatan  ·  3Комментарии

yarko picture yarko  ·  3Комментарии

Ajordat picture Ajordat  ·  4Комментарии