gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:27:39 25 4
gpt4 key购买 nike

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

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 具有用于提交和查询数据库的所有功能(没有真正触及文件系统),并且它进一步从定义我的表的“模型”文件中提取。这是一个 Flask/uwsgi 应用程序(如果有帮助的话)

最佳答案

使用此代码:

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$

为了响应上述 session ,代码记录了以下内容标准输出:

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

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

关于python - 递归 pyinotify 监视阻止子目录被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32338271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com