大家好,
在监控 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.
同样的问题在这里,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
您希望在看门狗中看到什么解决方案(代码更改)?
最有用的评论
我现在也在寻找延迟/重试 dirwatcher 线程的解决方案:
OSError: [WinError 64] 指定的网络名称不再可用