【发布时间】:2017-12-05 07:31:41
【问题描述】:
我有一个 inotify/内核问题。我正在使用“inotify”Python 项目进行观察,但我的问题本质上仍然是关于核心 inotify 内核实现。
Python inotify 项目处理递归 inotify 监视。它提供了一个很好的生成器,允许您循环事件。它通过识别目录创建事件并在产生事件之前自动添加这些监视来实现递归监视。
我注意到“mkdir -p”调用有一些奇怪的行为。虽然我可以快速、增量地创建单个目录并从事件循环中查看它们,但“mkdir -p”永远不会为子目录的子目录或在该子目录中创建的文件生成事件。
有人有什么想法吗?
作品:“mkdir aa && mkdir aa/bb && touch aa/bb/文件名”:
(_INOTIFY_EVENT(wd=1, mask=1073742080, cookie=0, len=16), ['IN_ISDIR', 'IN_CREATE'], '/tmp/tmpt3MlIQ', u'aa')
(_INOTIFY_EVENT(wd=2, mask=1073742080, cookie=0, len=16), ['IN_ISDIR', 'IN_CREATE'], u'/tmp/tmpt3MlIQ/aa', u'bb')
(_INOTIFY_EVENT(wd=3, mask=256, cookie=0, len=16), ['IN_CREATE'], u'/tmp/tmpt3MlIQ/aa/bb', u'filename')
(_INOTIFY_EVENT(wd=3, mask=32, cookie=0, len=16), ['IN_OPEN'], u'/tmp/tmpt3MlIQ/aa/bb', u'filename')
(_INOTIFY_EVENT(wd=3, mask=4, cookie=0, len=16), ['IN_ATTRIB'], u'/tmp/tmpt3MlIQ/aa/bb', u'filename')
(_INOTIFY_EVENT(wd=3, mask=8, cookie=0, len=16), ['IN_CLOSE_WRITE'], u'/tmp/tmpt3MlIQ/aa/bb', u'filename')
不起作用:“mkdir -p aa/bb && touch aa/bb/filename”:
(_INOTIFY_EVENT(wd=1, mask=1073742080, cookie=0, len=16), ['IN_ISDIR', 'IN_CREATE'], '/tmp/tmpuTSxYl', u'aa')
(_INOTIFY_EVENT(wd=1, mask=1073741856, cookie=0, len=16), ['IN_ISDIR', 'IN_OPEN'], '/tmp/tmpuTSxYl', u'aa')
(_INOTIFY_EVENT(wd=1, mask=1073741840, cookie=0, len=16), ['IN_ISDIR', 'IN_CLOSE_NOWRITE'], '/tmp/tmpuTSxYl', u'aa')
当然,我做了下一个我能想到的明显的、无脑的事情,并将“-p”标志添加到“mkdir aa && mkdir aa/bb”,只是为了确保没有任何“-p” - 特定的异常,但没有任何区别。
“mkdir -p”的 GNU 实现只是在路径中从分隔符迭代到分隔符。没有魔法。 os.makedirs(相同功能)的 Python 实现也只是拆分路径并枚举部分。然而,GNU 不工作,但 Python 工作。这似乎暗示了一种竞争条件,只是无论我如何操纵这些条件,结果都是相同的。我什至开始在我们正在执行的 epoll 上使用微不足道的超时来读取事件(阅读:如果原始超时值有任何延迟,则不再是工厂)。就好像内核中的inotify似乎完全错过了“mkdir -p”中的后续创建。
我确定我只是错过了一些东西。
作为参考,GNU 实现中涉及的调用:
http://code.metager.de/source/xref/gnu/coreutils/src/mkdir.c
http://code.metager.de/source/xref/gnu/octave/gnulib-hg/lib/mkdir-p.c#85
http://code.metager.de/source/xref/gnu/octave/gnulib-hg/lib/mkancesdirs.c#67
请注意,我们从 GNU 的“coreutils”开始,显然进入 GNU Octave 以实现“mkdir -p”。这是 OpenGrok 提供的唯一参考。我无法解释这一点,而且我处于陌生的领域。
Python 的实现:
https://github.com/python/cpython/blob/master/Lib/os.py#L196
我是否忽略了 inotify 行为的一些细节?
【问题讨论】:
标签: inotify