4

我们有几个 cron 作业将 ftp 代理日志传输到中央服务器。这些文件可能相当大,需要一些时间来传输。该项目的部分要求是提供一种记录机制,我们可以在其中记录这些转移的成功或失败。这很简单。

我的问题是,有没有办法检查当前是否正在写入文件?我的第一个解决方案是在给定的时间范围内检查文件大小两次并检查文件大小。但是一位同事说,也许可以通过 python 挂钩到 EXT3 文件系统并检查属性以查看文件当前是否正在附加到。我的 Google-Fu 空了。

是否有 EXT3 的模块或其他可以让我检查文件状态的模块?服务器正在运行带有 EXT3 文件系统的 Fedora Core 9。

4

2 回答 2

7

不需要 ext3 特定的钩子;只需检查lsof,或更准确地说,/proc/<pid>/fd/*/proc/<pid>/fdinfo/*(这就是lsof获取信息的地方,AFAICT)。在那里您可以检查文件是否打开、是否可写以及“光标”位置。

这不是全部。但是在写入过程中,stdlib 在 processpace 中完成了更多工作,因为大多数写入都是缓冲的,内核只能看到更大的数据块,所以任何“ext3-aware”监视器也不会得到它。

于 2009-07-02T16:45:20.067 回答
1

没有 ext3 挂钩可以直接检查您想要的内容。

  • 我想您可以挖掘Fuser linux 命令的源代码,复制找到哪个进程拥有文件的部分,然后观察该资源。当不再有人打开文件时,它就完成了传输。

另一种方法:

  • 您的 cron 作业应该告诉他们已经完成。

我们有传输文件的 cron 作业,只是在传输文件名后写入一个空的文件完成。另一种方法是将它们转移到一个临时文件名,例如filename.part然后将其重命名为filename重命名是原子的。在这两种情况下,您都会反复检查,直到存在filenamefilename.finished

于 2009-07-02T16:55:34.817 回答