在文件更新时安全地 tar 压缩文件

Safely tar compress a file while it is updating

我需要使用进程中线程中的 tar 在 Linux 上压缩文件。该文件每秒更新一次。

我运行下面的命令是从一个单独的进程中执行的。

tar -cvzf /destination/compressed_files.tar.gz /directory/to/archive

效果很好。没有发现问题。但是,我有以下问题。

主要问题:
我试图让我的代码更安全、更可靠。以上方式安全吗"in perspective of tar command"。 tar 是否隐含地处理了文件正在更新并尽可能压缩的事实? tar 是否在内部复制内容?

第二个问题:
我发现以下也是 tar 的一种方法

    tar -cvzf /destination/compressed_files.tar.gz -C /destination /directory/to/archive

看起来 -C 选项更改了目录?在这里使用-C是不是更安全?

您将获得的行为取决于一系列因素,包括文件系统的类型(例如 NFS 与本地磁盘)、文件的写入方式以及每次附加的数据量。

在最好的情况下,编写器以追加模式打开本地文件,并写入不超过某个内部缓冲区大小的文本行。在这种情况下,您可能看不到任何问题。如果线条很长,您可能会看到部分线条。如果文件模式不是附加的,或者文件系统是 NFS 或其他不寻常的东西,您可能会在文件末尾看到零或垃圾值(因为文件长度在内容之前更改)。

一般情况下,还是不要靠这个比较好。一种典型的方法是每隔一段时间 "roll" 文件,关闭旧文件并开始编写新文件。然后你可以只存档 "complete" 作者已经关闭的文件(并且可能重命名以表明它们是完整的)。