incron 的 IN_CREATE 事件会给我一个空白文件吗?

incron 的 IN_CREATE 事件会给我一个空白文件吗?

我想监视一个目录中是否有新文件,该文件将由另一个进程创建。我打算用来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

相关内容