这是一个奇怪的,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应用程序,如果它有帮助
答案 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也被调用去除了一个子目录,而这个子目录又启动了一个函数,我必须确保通过网络上传时存在“项目”的目录门户。
我仍然感到困惑,但这个特殊问题已经解决了