我的数据中心有两台机器:
公共服务器通过ftp公开部分内部服务器的存储。当文件上传到ftp时,文件实际上最终会在内部存储上。但是当观察内部服务器存储器上的inotify事件时,我注意到文件是以块的形式写入的,可能是由于客户端的缓冲。内部服务器上的软件会监视inotify事件,以确定新文件是否已到达。但是由于编写文件的NFS方式,没有好的方法可以告诉文件何时完成。有没有办法告诉NFS客户端只在一个操作中写文件,或者是否有解决此问题的方法?
修改
上传大约900 MB的文件时,我在内部服务器上获得的事件是:
./ CREATE big_buck_bunny_1080p_surround.avi
# after the CREATE i get around 250K MODIFY and CLOSE_WRITE,CLOSE events:
./ MODIFY big_buck_bunny_1080p_surround.avi
./ CLOSE_WRITE,CLOSE big_buck_bunny_1080p_surround.avi
# when the upload finishes i get a CLOSE_NOWRITE,CLOSE
./ CLOSE_NOWRITE,CLOSE big_buck_bunny_1080p_surround.avi
当然,我可以收听CLOSE_NOWRITE事件,但阅读inotify文档说:
close_nowrite
A watched file or a file within a watched directory was closed, after being opened in read-only mode.
与文件完整的文件不完全相同'。我看到的唯一解决方法是使用.part或.filepart文件,并在上传后将它们移动到原始文件名并忽略我的存储观察器中的.part文件。缺点是我必须向客户解释这个问题,如何使用.part上传。默认情况下,没有多少ftp客户端支持此功能。
答案 0 :(得分:0)
基本上,如果要检查写操作何时完成,请监视事件IN_CLOSE_WRITE
。
IN_CLOSE_WRITE
在文件关闭时被“触发”,该文件已打开以供写入。即使文件以块的形式传输,FTP服务器也只有在整个文件传输完毕后才会关闭文件。