备份大文件

备份大文件

我有一个测试运行崩溃了。我需要找出它在坠毁之前到达了多远。崩溃后它将再次重新启动并擦除日志文件。不过这个擦拭需要10分钟。因此,如果我每 9 分钟保存一次日志文件,我应该能够获取该日志文件。

问题是,如何编写 bash 脚本来将日志文件复制到特定位置,并仅当复制的文件大于目标文件时才覆盖现有文件(如果有)。否则我想不管它。

 25       if [ -f $testFile ]; then
 26         COUNT=`cat $testFile|wc -l`
 27                 if [ $COUNT -gt 0 ];then
 28                     ARGS=`head -1 $testFile`
 29                     echo "Executing test for ARGS"
 30                     sed -i '1d' $testFile
 31                     cd /testCode; sleep 600

此时,代码会休眠 10 分钟,如前所述

 32                     /testCode/startTest.sh $ARGS

这将启动删除日志文件的测试。如果测试没有崩溃,那么当测试完成时,它将转到下一个命令。否则又从顶部开始

 33                     `wall "System is going down for reboot in 600 seconds. Please save your work"`
 34                     sleep 600
 35                     /sbin/reboot &
 36                     exit 0
 37                 fi
 38 fi

更新#1

我想出了一个办法。因此,当测试开始时,我保存上次运行的日志。然后我有足够的时间在测试重新启动时检查日志。测试通常会在一小时左右后因段错误而崩溃。这给了我充足的时间来检查日志。

这不是一个真正干净的方法,但它会起作用。 @Alexandre Alves 也给出了很好的答案。那也可以。 @Slm 给出了一个很好的答案,但不幸的是,这在像我这样的大型测试中不起作用,因为这会使日志文件变得混乱。

另外,我的问题是保存日志文件,而不是日志记录本身。

答案1

我会打开对开始崩溃的测试的行进行调试。您可以使用下面概述的技术之一:

  1. 从调用脚本调试整个脚本

    bash -x /testCode/startTest.sh $ARGS
    
  2. 调试脚本本身

    或者,如果您可以控制此脚本,则可以在顶部添加 shebang 行,如下所示:

    #!/bin/bash -x
    
  3. 调试代码的特定部分

    或者,您可以在脚本中需要更详细信息的部分执行此操作:

    line1
    line2
    
    set -x
    line3
    line4
    set +x
    
    line5
    

答案2

我猜您无法更改测试记录日志文件的方式。

但我可以建议两种方法:

  1. 如果你真的想要一个 bash 脚本那么

    #!/bin/bash
    source_size=`du -b file1|cut -f 1`
    destin_size=`du -b file2|cut -f 1`
    if [ $source_size -gt $destin_size ]; then
        mv file1 file1.bck
        touch file1
        cp file1.bck /destination/file2
        rm file1.bck
    fi
    

    请注意,我先进行移动,然后复制文件,因为如果您要在不同的文件系统之间移动文件,则必须先复制然后删除。这意味着您可能会遇到文件在移动时被测试覆盖的情况。

  2. 使用 T 恤

    如果您知道问题何时会发生,那么您可以这样做

    tail -f logfile |tee newlog
    

    这将向粗略的日志文件显示,同时写入新的日志文件。

  3. 更改测试创建日志文件的方式以执行日志文件轮换。

相关内容