哪个inotify 事件标志着一个大文件操作的完成?

Posted

技术标签:

【中文标题】哪个inotify 事件标志着一个大文件操作的完成?【英文标题】:which inotify event signals the completion of a large file operation? 【发布时间】:2010-05-24 06:36:06 【问题描述】:

对于大文件或慢速连接,复制文件可能需要一些时间。

使用 pyinotify,我一直在关注 IN_CREATE 事件代码。但这似乎发生在文件传输的开始。我需要知道一个文件何时被完全复制 - 如果它只有一半,它就没有多大用处。

当文件传输完成并完成时,会触发什么 inotify 事件?

【问题讨论】:

【参考方案1】:

IN_CLOSE 可能 表示写入完成。这不确定,因为某些应用程序是不良行为者,并且在使用它们时会不断打开和关闭文件,但是如果您知道您正在处理的应用程序(文件传输等)并了解它的行为,那么您就是可能没问题。 (注意,这并不代表传输成功,很明显,它只是意味着打开文件句柄的进程关闭了它。

IN_CLOSE 捕获 IN_CLOSE_WRITEIN_CLOSE_NOWRITE,因此请自行决定是否只想捕获其中之一。 (您可能同时想要它们 - WRITE/NOWRITE 与文件权限有关,而不是实际是否进行了任何写入)。

Documentation/filesystems/inotify.txt 中有更多文档(虽然很烦人,但不是这条信息)。

【讨论】:

我的问题专门与 nautilus 中的文件复制有关。在这种情况下,IN_CLOSE_WRITE 就足够了。 pyinotify 中不存在 IN_CLOSE 本身。【参考方案2】:

就我而言,我想在文件完全上传后执行一个脚本。我使用的是 WinSCP,它会写入带有 .filepart 扩展名的大文件,直到完成。

我首先开始修改我的脚本以忽略文件,如果它们本身以 .filepart 结尾,或者同一目录中存在另一个同名但扩展名为 .filepart 的文件,因此这意味着上传尚未完全完成.

但后来我注意到,在上传结束时,当所有部分都完成后,我会触发 IN_MOVED_IN 通知,这有助于我在需要的时候准确地运行我的脚本。

如果您想知道文件上传器的行为方式,请将其添加到 incrontab:

/your/directory/ IN_ALL_EVENTS echo "$$ $@ $# $% $&"

然后

tail -F /var/log/cron

并监控所有被触发的事件,以找出最适合您的事件。

祝你好运!

【讨论】:

【参考方案3】:

为什么不在传输结束时添加一个虚拟文件?您可以在假人上使用 IN_CLOSE 或 IN_CREATE 事件代码。重要的是 dummy 作为序列中的最后一个文件传输。

希望对你有帮助。

【讨论】:

以上是关于哪个inotify 事件标志着一个大文件操作的完成?的主要内容,如果未能解决你的问题,请参考以下文章

使用 inotify 通知新文件

Linux/Unix 使用inotify,hook函数来监控文件事件

Linux/Unix 使用inotify,hook函数来监控文件事件

Linux/Unix 使用inotify,hook函数来监控文件事件

以编程方式在 linux 上触发 inotify 事件

rsync+inotify实时同步