我如何tar另一个进程正在使用的文件?

时间:2009-02-18 11:44:45

标签: linux perl archive tar

我正在归档一个目录。此目录有一个由另一个进程写入的文件。当我使用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之前关闭文件句柄。

5 个答案:

答案 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无法解决文件系统限制。