3

我正在归档一个目录。该目录有一个正在由另一个进程写入的文件。当我使用 Linux tar/Perl Tar 模块 tar 时,在存档中文件的条目在那里,但内容为空。

在压缩文件之前...

-rw-r--r--  1 irraju dba 28 Feb 18 02:22 a
-rw-r--r--  1 irraju dba 25 Feb 18 02:23 b
-rw-r--r--  1 irraju dba 29 Feb 18 03:38 c

解压后

-rw-r--r-- irraju/dba       28 2009-02-18 02:22:58 a
-rw-r--r-- irraju/dba       25 2009-02-18 02:23:17 b
-rw-r--r-- irraju/dba        0 2009-02-18 03:33:12 c

我该如何解决这个问题?我希望该文件与存档时的内容一起保存在存档中。该文件可以是日志文件,并假设我们无法在 tarring 之前关闭文件句柄。

4

5 回答 5

5

当您用“Linux”标记问题时,您可能正在使用 LVM 分区。如果您确实在 LVM 分区上运行,则可以使用 LVM 快照功能。

这是有关如何执行操作的相关 LVM 文档的链接。

这是LVM 快照介绍的一部分:

LVM 提供的一个很棒的工具是“快照”。这允许管理员创建一个新的块设备,它提供一个逻辑卷的精确副本,在某个时间点冻结​​。通常,当需要在逻辑卷上执行一些批处理(例如备份),但您不想停止正在更改数据的活动系统时,通常会使用此选项。当快照设备完成后,系统管理员可以删除设备。此功能确实要求在逻辑卷上的数据处于一致状态时创建快照 - LVM1 的 VFS 锁定补丁确保某些文件系统在创建快照时自动执行此操作,并且许多2.6 内核中的文件系统会在创建快照时自动执行此操作而无需打补丁。

于 2009-02-18T13:13:47.260 回答
3

尝试先复制文件...

cp a a.tmp
cp b b.tmp
cp c c.tmp

...然后将所有内容打包在一起...

tar *.tmp abc.tar

...并清理:

rm *.tmp

如果这不起作用,那么持有文件句柄的进程不想共享读取访问权限......

于 2009-02-18T11:52:14.820 回答
2

您可能会发现这取决于使用的文件系统和访问文件的应用程序。最接近通用解决方案的是使用支持快照的文件系统并在运行 tar 之前创建快照。

于 2009-02-18T11:53:19.357 回答
2

您的第二个输出是您的第一个输出之后进行的,这是不对的。我猜tar就在这里:当它工作时,文件是空的。您可能正在处理这里的竞争条件。

于 2009-02-18T12:26:45.533 回答
0

As others have said, it depends on the file system & OS being used. sync first (or whatever the equivalent is on your file system), copy the files to a temp directory and then tar them up. If the file system won't allow you to copy an opened file, then you're SOL; Perl can't get around file system limitations.

于 2009-02-18T13:16:33.527 回答