Bash 当文件夹中的文件可能由其他进程写入时,如何对文件夹进行tar

Bash 当文件夹中的文件可能由其他进程写入时,如何对文件夹进行tar,bash,cron,tar,Bash,Cron,Tar,我正在尝试为cron作业创建脚本。我有大约8GB的文件夹,其中包含数千个文件。我正在尝试创建一个bash脚本,该脚本首先对文件夹进行tar,然后将tarred文件传输到ftp服务器 但我不确定tar是在给文件夹涂焦油,还是其他进程在访问文件夹中的文件或写入文件夹中的文件 尽管对我来说,如果tar在给文件夹加焦油时,焦油文件不包含最近的更改,这也没问题 建议我正确的方法。谢谢。我认为在存档过程中修改存档文件时,tar失败(因此不要创建存档)。正如Etan所说,解决方案取决于您最终在tarball中

我正在尝试为cron作业创建脚本。我有大约8GB的文件夹,其中包含数千个文件。我正在尝试创建一个bash脚本,该脚本首先对文件夹进行tar,然后将tarred文件传输到ftp服务器

但我不确定tar是在给文件夹涂焦油,还是其他进程在访问文件夹中的文件或写入文件夹中的文件

尽管对我来说,如果tar在给文件夹加焦油时,焦油文件不包含最近的更改,这也没问题

建议我正确的方法。谢谢。

我认为在存档过程中修改存档文件时,tar失败(因此不要创建存档)。正如Etan所说,解决方案取决于您最终在tarball中想要什么

为了避免tar失败,您只需在调用tar之前将文件夹复制到其他位置即可。但是在这种情况下,您不能对备份目录的一致性有信心。这不是一个原子操作,因此一些文件将过时,而其他文件将过时。这可能是一个严重的问题,也可能不符合您的情况

如果可以,我建议您配置如何创建这些文件。例如:“只追加最近的文件,超过1天的文件永远不会更改”,在这种情况下,您可以轻松地只备份旧文件,备份将保持一致

更一般地说,您必须接受丢失最后一个数据不一致(每个文件在不同的日期备份),或者您必须在不同的级别采取行动。我建议:

  • 配置生成数据的软件以选择一致性
  • 或者使用操作系统/虚拟化功能。例如,可以在某个虚拟存储上执行存储的一致快照
  • 焦油可能会“尽可能”焦油化。但是,在清除错误时,您可能会有一些惊喜,因为tar还存储了它所处理的文件的大小,然后才对其进行处理。所以期待一些惊喜吧

    • 一个非常令人不快的惊喜是:如果大小被截断,那么tar将用“NUL”字符“填充”它,以匹配它记录的大小。。。这会产生非常不愉快的副作用。在某些情况下,tar在解除错误时不会说任何话,而是默默地添加与大小匹配所需的NUL字符(事实上,在unix中,它甚至不需要这样做:操作系统会这样做,请参阅“稀疏文件”)。在某些情况下,如果在对文件进行tar时发生了截断,tar会抱怨在解除错误时遇到了意外的文件结尾(因为它预期的是XXX字节,但读取的值小于此值),但仍然会说该文件应该是XXX字节(然后unix操作系统会将其创建为稀疏文件,并带有“NUL”字符神奇地附加在末尾,以匹配阅读时的预期大小)。 (查看NUL字符:一个简单的方法是
      减少文件
      (或者在非常旧的unix上
      cat-v文件|更多
      。查找任何
      ^

    • 但恰恰相反,如果文件只是附加到(日志等)中,那么副作用就没有那么大问题:你只会错过其中的一些部分(你说你没问题),并且不会产生令人不快的“填充NUL字符”副作用。tar在解除文件错误时可能会抱怨,但它会解除文件的错误


    这些文件是什么?更确切地说,我想知道我们是否“附加”或者,如果我们创建新文件。例如,如果您的文件是日志文件,并且如果配置了日志循环,那么命名约定可能会有所帮助……问题是,当发生这种情况时,您希望tar做什么。并且要意识到,根据您告诉tar如何执行其工作,它可能会或可能根本不会看到新文件。@mcoolive每个文件都有一个random 16个字符长的名称。这些文件可能会被追加,或者也可以在文件夹中创建新文件。@Etan Reisner,如果遇到文件中的任何更改或者其他进程正在访问这些文件,将停止对其进行tar处理。如果tar继续对文件夹进行tar处理,对我来说很好,我可以避免最近的许多更改(这些更改将在第二天的tarring中涵盖)我不能确定,但我认为它不会注意到它所完成的文件的更改,不会注意到它正在处理的文件的更改(可能会重新启动它们),并且只会注意到新文件,如果您告诉它对它们所在的目录进行tar(与使用glob相反).我认为它根本不关心独占访问,只要它可以读取文件。