这是一个奇怪的问题,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 应用程序