【问题标题】:How can I tar a file that is being used by another process?如何 tar 正在被另一个进程使用的文件?
【发布时间】:2010-10-08 07:48:56
【问题描述】:

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

【问题讨论】:

  • “Perl Tar 模块”是指 Archive::Tar 吗?

标签: linux perl archive tar


【解决方案1】:

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

这是相关LVM documentation on how to perform the operation的链接。

这是LVM snapshot intro的一部分:

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

【讨论】:

    【解决方案2】:

    正如其他人所说,这取决于所使用的文件系统和操作系统。 sync 首先(或文件系统上的任何等效项),将文件复制到临时目录,然后将它们打包。如果文件系统不允许您复制打开的文件,那么您就是 SOL; Perl 无法绕过文件系统的限制。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          先尝试复制文件...

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

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

          tar *.tmp abc.tar
          

          ...并清理:

          rm *.tmp
          

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

          【讨论】:

          • 在 tar 之前复制文件可能会非常昂贵,特别是如果这些文件是大文件,或者文件系统中没有足够的空间来复制所有文件。
          • 我认为这不会是一个问题,但我不知道一切,显然你知道你在说什么。然而,那个复制的东西,它是一个巧妙的把戏。
          猜你喜欢
          • 1970-01-01
          • 2011-04-13
          • 1970-01-01
          • 2016-12-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多