轮询就绪文件

Polling for readiness file

我在 Linux 上工作。如何知道 gzip 文件已准备就绪?我有一台轮询目录 /dir/ 中的文件的服务器。 gzip/dir/ 提交了另一个独立的进程。我的服务器如何知道文件已准备好?

目前还没有现成的解决方案。查看文件的最后修改时间戳 (mtime) 是不可靠的,因为如果系统过载(或 gzip 操作的输入未准备好),写入可能会延迟,或者生成进程可能会停止写入,因为它崩溃了。

通常,当应用程序需要执行此类操作时,它们会按照特定模式以不同的名称写入临时文件。读取过程识别临时文件并跳过它们,假设它们仍在进行中且未完成。编写器完成后,它会将文件重命名为其最终名称(这是一个原子操作),然后 reader 才会拾取它。这种方法因 Dan Bernstein 的 maildir 格式而流行:

在maildir中,使用了不同的目录进行暂存,但大体原理是一样的。

也可以使用锁定文件和POSIX advisory locking,但它们会导致更复杂。但是,在某些情况下,可以以不需要繁忙 waiting/polling/periodic 探测的方式使用它们。