Watchdog: キャッチできないOSError:アクセスが拒否されました

作成日 2011年10月10日  ·  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'
kqueue

最も参考になるコメント

それで、ええと、この問題は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

おっと、この問題はかなり古いです!

[...]ウォッチドッグにエラーハンドラーを提供する方法はありますか? それとも、他のファイルの監視を継続しますか?

今のところ、できる最善のことは、非再帰的なウォッチャーをスケジュールすることです。

これはコードにかなり散在しているものであり、禁止されたアクセスはいつでも発生する可能性があるため( chmodchownまたはSELinuxツールを使用)、ウォッチャーの作成時間処理の問題とエミッター処理の問題の両方です。 )。 それをAPIで適切に修正する方法について何か考えがありますか(ダーティハック以外)?

おそらく、 errno.EACCES (#459を思い出させる)は、残りのディレクトリの監視を禁止しないように、デフォルトで警告を発行して処理する必要があります。 しかし、それだけではこの問題を解決するには不十分なようです。

これにより、基本的に、複数のユーザーが使用できないユースケースが発生します。 動作しない別のイベント...ユーザーが700のディレクトリを持っている場合、そのディレクトリを監視対象ツリーにコピーします。 クラッシュすることはなく、エラーが発生するだけです。 chmod 755なので、ウォッチドッグプロセスはツリー内のすべてのファイルを読み取ることができます。 そうではありません。

おそらく、ある種のOSエラーを追加のイベントにするだけですか? ユーザーはそれをどうするかを決めることができます。
それはおそらく最もきれいでしょう。

このページは役に立ちましたか?
0 / 5 - 0 評価