1

这是一个奇怪的问题,strace 没有给我任何有用的信息。我正在使用 pyinotify 0.9.6 递归地监视目录,以便我可以将有关它的更改提交到 MySQL 数据库。问题是当我运行 pyinotify 时(无论是否被守护),我可以删除子目录中的文件,但不能删除子目录本身。rmdir 以状态 0 退出,并且在系统级别上看起来一切正常,但子目录仍然存在,只是令人不寒而栗。我可能只是因为我是框架的新手而变得愚蠢,但这里是我如何初始化手表的示例:

wm = pyinotify.WatchManager()
notifier = pyinotify.Notifier(wm)
wm.add_watch('/path/to/dir', pyinotify.IN_CLOSE_WRITE, rec=True, auto_add=True,\
        proc_fun=CommitFunction() # I can supply this if you think it's relevant
notifier.loop(daemonize=True, callback=None,\
        stdout='/path/to/log.log, stderr='/path/to/log.log')

所以在这个例子中,如果有一个文件'/path/to/dir/file.txt'我可以在'file.txt'上运行一个rm并且它被删除,但是如果有一个子目录'/path/to /dir/subdir' 在 'subdir' 上运行 rm -r 会干净地退出,但该目录实际上并没有被删除。

此外,我的日志没有被写入,但我很确定这是我的错。

编辑:

这是一个示例 CommitFunction:

class CommitFunction(pyinotify.ProcessEvent):
    def process_default(self, event):
        dir = event.path
        file = event.name
        print "%s is the new file" % os.path.join(dir, file)

EDIT2:实际上我的日志可能没有被写入,因为在提交期间我没有在任何地方调用日志或打印函数。我只是直接写到我的 MySQL 数据库

EDIT3:好的。希望我没有深入研究。这是我在命令行上尝试的:

bash$ cd /var/www
bash$ mkdir subdir
bash$ rmdir subdir
bash$ ls
subdir

这是实际的提交函数:

class CommitFunction(pyinotify.ProcessEvent):
    def process_default(self, event):
        dir = event.path
        file = event.name
        dbaccess.commit(dir, file) # dir corresponds to a project name

如果您愿意,我可以继续深入,但 dbaccess 具有提交和查询数据库的所有功能(没有真正触及 fs),并且它进一步从定义我的表的“模型”文件中提取。如果有帮助的话,它是一个烧瓶/uwsgi 应用程序

4

2 回答 2

1

使用此代码:

import pyinotify
import os


class CommitFunction(pyinotify.ProcessEvent):
    def process_default(self, event):
        dir = event.path
        file = event.name
        print "%s is the new file" % os.path.join(dir, file)


wm = pyinotify.WatchManager()
notifier = pyinotify.Notifier(wm)
wm.add_watch('/tmp/testdir', pyinotify.IN_CLOSE_WRITE, rec=True,
             auto_add=True, proc_fun=CommitFunction())
notifier.loop(daemonize=False, callback=None)

我可以在目标目录中创建和删除子目录而不会出错:

bash-4.3$ pwd
/tmp/testdir
bash-4.3$ mkdir subdir
bash-4.3$ rm -r subdir
bash-4.3$ ls
bash-4.3$ 

作为对上述会话的响应,代码在标准输出上记录了以下内容:

/tmp/testdir/subdir is the new file
/tmp/testdir/subdir/ is the new file

您能否确认以上是否表现出您在您的环境中描述的行为?如果没有,你能用一个完整的例子来更新你的问题吗?

于 2015-09-01T18:27:14.790 回答
0

好的,所以我遇到的问题是在删除子目录时也会调用 IN_CLOSE_WRITE,这反过来又触发了一个函数,我必须确保在通过 Web 门户上传时存在“项目”的目录。

我仍然很困惑,但是这个特殊的问题已经解决了

于 2015-09-01T19:12:41.063 回答