对于大文件或慢速连接,复制文件可能需要一些时间。
使用 pyinotify,我一直在关注 IN_CREATE 事件代码。但这似乎发生在文件传输开始时。我需要知道文件何时被完全复制——如果它只有一半,它就没有多大用处。
当文件传输完成并完成时,会触发什么 inotify 事件?
IN_CLOSE
可能意味着写入完成。这不确定,因为某些应用程序是不良行为者,并且在使用它们时会不断打开和关闭文件,但是如果您知道您正在处理的应用程序(文件传输等)并了解它的行为,那么您就是可能没问题。(注意,这并不意味着传输成功完成,显然,它只是意味着打开文件句柄的进程关闭了它)。
IN_CLOSE
捕获两者IN_CLOSE_WRITE
和IN_CLOSE_NOWRITE
,因此请自行决定是否只想捕获其中之一。(您可能同时需要它们 -WRITE/NOWRITE
与文件权限有关,而不是实际是否进行了任何写入)。
在Documentation/filesystems/inotify.txt中有更多文档(虽然很烦人,但不是这条信息)。
对于我的情况,我想在文件完全上传后执行一个脚本。我正在使用 WinSCP,它会写入带有.filepart
扩展名的大文件,直到完成。
我首先开始修改我的脚本以忽略文件,如果它们本身以 .filepart 结尾,或者如果同一目录中存在另一个具有相同名称但扩展名为 .filepart 的文件,因此这意味着上传尚未完全完成。
但是后来我注意到在上传结束时,当所有部分都完成后,我会IN_MOVED_IN
触发一个通知,这有助于我在我想要的时候准确地运行我的脚本。
如果您想知道文件上传器的行为方式,请将其添加到 incrontab 中:
/your/directory/ IN_ALL_EVENTS echo "$$ $@ $# $% $&"
接着
tail -F /var/log/cron
并监控所有被触发的事件,以找出最适合您的事件。
祝你好运!
为什么不在传输结束时添加一个虚拟文件?您可以在假人上使用 IN_CLOSE 或 IN_CREATE 事件代码。重要的是虚拟对象将作为序列中的最后一个文件传输。
我希望它会有所帮助。