递归pyinotify监视阻止子目录被删除

时间:2015-09-01 18:10:35

标签: python pyinotify

这是一个奇怪的,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'运行rm -r on' subdir'干净利落地退出,但目录实际上并没有被删除。

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

编辑:

这是一个示例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应用程序,如果它有帮助

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

好的,我遇到的问题是IN_CLOSE_WRITE也被调用去除了一个子目录,而这个子目录又启动了一个函数,我必须确保通过网络上传时存在“项目”的目录门户。

我仍然感到困惑,但这个特殊问题已经解决了