我想监视一个目录中是否有新文件,该文件将由另一个进程创建。我打算用来incrod
做这个。
我对对文件的更改做出反应不感兴趣,因为文件永远不应该更新。因此,该IN_CREATE
事件似乎是聆听的明智选择。但是,我不确定,如果我监听该事件,我最终会得到一个空文件(在其他进程向其中写入任何信息之前)吗?我应该使用该IN_WRITE_CLOSE
事件吗?
答案1
您可以观察哪些事件传递到您的目录,以inotifywait
检查进程运行时它的行为方式:
$ inotifywait -m .
Setting up watches.
Watches established.
例如,touch file
在同一目录中运行后:
$ inotifywait -m .
Setting up watches.
Watches established.
./ CREATE file
./ OPEN file
./ ATTRIB file
./ CLOSE_WRITE,CLOSE file
由于创建文件和关闭文件之间存在延迟,因此正如您所怀疑的那样,在 CREATE 事件之后您将得到空文件。观察运行后发生的事件:
from time import sleep
with open("somefile", 'w') as somefile:
sleep(15)
somefile.write("...")
因此,使用 CLOSE_WRITE 事件听起来很合理。
答案2
是的,IN_CREATE
将会(或至少可能)给你一个空文件。顾名思义,该事件在创建新文件时生成,并且新文件创建为空。当接收通知的进程开始读取文件时,该文件可能不为空,但通常此时它还没有完全写入。
IN_WRITE_CLOSE
您需要对已完成的文件做出反应。请注意,如果创建文件的进程崩溃,则会触发此事件。为了避免这种情况,常见的策略是让进程写入文件,然后重命名它(可能将其移动到不同的目录)。然后你的显示器会听IN_MOVED_FROM
。