Watchdog: WinError 58 使看门狗在即将发生的事件中失败

创建于 2015-09-14  ·  4评论  ·  资料来源: gorakhargosh/watchdog

大家好,

在监控 QNAP 内的文件夹时,我可以获得新创建文件的事件。 但是,如果新文件是目录,则看门狗会因系统错误而崩溃。

我怀疑这是因为文件仍在被复制,但这不应成为使侦听器崩溃的原因。

应用程序在 Windows 8.1 Pro 上运行。
QNAP 固件版本:3.7.2 Build 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: [WinError 64] 指定的网络名称不再可用

所有4条评论

同样的问题在这里,WinError 64 和消息:指定的网络名称不再可用。 当从不可用的文件服务器(SMB 共享)提供文件夹时会发生这种情况。

我们如何才能捕获此类错误,以便稍后重试附加观察者?

我现在也在寻找延迟/重试 dirwatcher 线程的解决方案:
OSError: [WinError 64] 指定的网络名称不再可用

我遇到了同样的问题,在监视远程文件共享时收到 WinError 64 消息。 我最终在 watchdog.utils.BaseThread 类周围创建了一个小包装器,它允许我捕获错误并恢复。 然后,在创建观察者之前,我用我的包装器对原始 BaseThread 类进行猴子修补。 在我的特定情况下,我会捕获 run 方法中可能发生的任何异常,并将它们添加到队列中,以便在不同的线程中使用。 这是一个hacky解决方案,但没有源代码更改的选项并不多。

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 等级