如何在另一个进程正在使用文件的情况下打包tar文件?

3

我正在归档一个目录。这个目录中有一个文件正在被另一个进程写入。当我使用Linux tar/Perl 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

我该如何解决这个问题?我希望文件在归档时保留其当前内容。该文件可能是日志文件,假设我们无法在压缩文件之前关闭文件句柄。


你所指的“Perl Tar模块”,是指Archive::Tar吗? - brian d foy
5个回答

5
由于您在问题中标记了“Linux”,所以有可能您正在使用LVM分区。如果确实是在LVM分区上运行,您可以使用LVM快照功能。以下是相关操作的LVM文档链接:http://tldp.org/HOWTO/LVM-HOWTO/snapshots_backup.html。以下是LVM快照介绍的一部分:http://tldp.org/HOWTO/LVM-HOWTO/snapshotintro.html
引用: LVM提供的一个非常好的功能是“快照”。这允许管理员创建一个新的块设备,该设备呈现出一个逻辑卷的精确副本,冻结在某个时间点。通常情况下,当需要对逻辑卷执行一些批处理(例如备份),但您不想停止正在更改数据的活动系统时,就会使用此功能。当完成快照设备后,系统管理员只需删除该设备即可。此功能要求在逻辑卷上的数据处于一致状态时进行快照 - VFS-lock补丁可确保LVM1上的某些文件系统在创建快照时自动执行此操作,并且2.6内核中的许多文件系统在创建快照时自动执行此操作而无需打补丁。

3

首先尝试复制文件...

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

...然后将所有内容打包成tar文件...

tar *.tmp abc.tar

...并清理:

rm *.tmp

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

在打包之前复制文件可能非常昂贵,特别是如果这些文件很大,或者文件系统中没有足够的空间来复制所有文件。 - Tom Feiner
我认为这不会是个问题,但我并不知道所有的东西,显然你知道你在说什么。无论如何,那个复制的东西真是个巧妙的技巧。 - John Leidegren

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

2

你的第二个输出是在第一个之后生成的,这不正常。我猜测tar是正确的:它在执行任务时,文件是空的。你可能遇到了竞争条件。


0

正如其他人所说,这取决于所使用的文件系统和操作系统。首先执行sync命令(或者在你的文件系统上等效的命令),将文件复制到临时目录,然后将它们打包成tar文件。如果文件系统不允许你复制已经打开的文件,那么你就没有办法了;Perl无法绕过文件系统的限制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接