我正在归档一个目录。此目录有一个由另一个进程写入的文件。当我使用Linux tar / Perl Tar模块对此进行tar时,在归档文件中,该文件的条目存在,但内容为空。
在tarring文件之前......
-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之前关闭文件句柄。
答案 0 :(得分:4)
当您使用“Linux”标记问题时,您可能正在使用LVM分区。 如果您确实在LVM分区上运行,则可以使用LVM快照功能。
以下是相关LVM documentation on how to perform the operation的链接。
以下是LVM snapshot intro的一部分:
LVM提供的一个很棒的设施是“快照”。这允许管理员创建一个新的块设备,该设备提供在某个时间点冻结的逻辑卷的精确副本。通常,当需要在逻辑卷上执行某些批处理(例如备份)但您不想暂停正在更改数据的实时系统时,将使用此方法。快照设备完成后,系统管理员只需删除该设备即可。此工具确实要求在逻辑卷上的数据处于一致状态时创建快照 - LVM1的VFS锁定补丁确保某些文件系统在创建快照时自动执行此操作,并且许多2.6内核中的文件系统在没有修补的情况下创建快照时自动执行此操作。
答案 1 :(得分:3)
首先尝试复制文件......
cp a a.tmp
cp b b.tmp
cp c c.tmp
...然后把所有东西压在一起......
tar *.tmp abc.tar
......并清理:
rm *.tmp
如果这不起作用,则持有文件句柄的进程不希望共享读访问权...
答案 2 :(得分:2)
您可能会发现这取决于所使用的文件系统和访问该文件的应用程序。最接近通用解决方案的是使用支持快照的文件系统,并在运行tar之前创建快照。
答案 3 :(得分:2)
你的第二个输出是在之后的第一个输出,这可能不对。我猜测tar
就在这里:当它正在完成它的工作时,文件是空的。你可能在这里处理竞争条件。
答案 4 :(得分:0)
正如其他人所说,这取决于文件系统&使用的操作系统。首先sync
(或者文件系统上的等效文件),将文件复制到临时目录,然后将它们tar起来。如果文件系统不允许您复制打开的文件,那么您就是SOL; Perl无法解决文件系统限制。