Watchdog: WinError 58により、ウォッチドッグは今後のイベントに失敗します

作成日 2015年09月14日  ·  4コメント  ·  ソース: gorakhargosh/watchdog

こんにちは、みんな、

QNAP内のフォルダーを監視すると、新しく作成されたファイルのイベントを取得できます。 ただし、新しいファイルがディレクトリの場合、ウォッチドッグはシステムエラーでクラッシュします。

ファイルがまだコピーされているためだと思いますが、それがリスナーをクラッシュさせる理由にはならないはずです。

アプリケーションはWindows8.1Proで実行されています。
QNAPファームウェアバージョン:3.7.2ビルド20120719
スタックトレース:

Exception in thread Thread-3:
Traceback (most recent call last):
  File "C:\Python34\lib\threading.py", line 920, in _bootstrap_inner
    self.run()
  File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\api.py", line 146, in run
    self.queue_events(self.timeout)
  File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\read_directory_changes.py", line 77, in queue_events
    winapi_events = read_events(self._handle, self.watch.is_recursive)
  File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\winapi.py", line 347, in read_events
    buf, nbytes = read_directory_changes(handle, recursive)
  File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\winapi.py", line 307, in read_directory_changes
    raise e
  File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\winapi.py", line 303, in read_directory_changes
    ctypes.byref(nbytes), None, None)
  File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\winapi.py", line 108, in _errcheck_bool
    raise ctypes.WinError()
OSError: [WinError 58] The specified server cannot perform the requested operation.

最も参考になるコメント

私は今、dirwatcherスレッドを遅延/再試行するための解決策を探しています:
OSError:[WinError64]指定されたネットワーク名は使用できなくなりました

全てのコメント4件

WinError 64とメッセージ:指定されたネットワーク名は使用できなくなりました。 これは、フォルダーが使用できなくなったファイルサーバー(SMB共有)から提供される場合に発生します。

後でオブザーバーのアタッチを再試行するために、この種のエラーをどのようにキャッチできますか?

私は今、dirwatcherスレッドを遅延/再試行するための解決策を探しています:
OSError:[WinError64]指定されたネットワーク名は使用できなくなりました

リモートファイル共有を監視しているときにWinError64メッセージが表示されるのと同じ問題が発生しました。 最終的に、watchdog.utils.BaseThreadクラスの周りに小さなラッパーを作成して、エラーをキャッチして回復できるようにしました。 次に、オブザーバーを作成する前に、ラッパーを使用して元のBaseThreadクラスにモンキーパッチを適用します。 私の特定のケースでは、runメソッドで発生する可能性のある例外をキャッチし、それらをキューに追加して、別のスレッドで使用します。 これはハッキーなソリューションですが、ソースコードを変更しない限り多くのオプションはありません。

import logging
import threading

import watchdog.utils

logger = logging.getLogger(__name__)


class BaseThreadWrapper(watchdog.utils.BaseThread):
    """
    Wrapper around watchdog BaseThread class.

    """
    queue = None

    def __init__(self):
        super(BaseThreadWrapper, self).__init__()
        self._original_run = self.run
        self.run = self.run_wrapper

    def run_wrapper(self):
        try:
            self._original_run()
        except Exception as e:
            logger.exception('%s thread exited with error',
                             threading.current_thread().name)
            self.queue.put(e)


watchdog.utils.BaseThread = BaseThreadWrapper

ウォッチドッグでどのような解決策(コードの変更)を見たいですか?

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