我有一个测试运行崩溃了。我需要找出它在坠毁之前到达了多远。崩溃后它将再次重新启动并擦除日志文件。不过这个擦拭需要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
我会打开对开始崩溃的测试的行进行调试。您可以使用下面概述的技术之一:
从调用脚本调试整个脚本
bash -x /testCode/startTest.sh $ARGS
调试脚本本身
或者,如果您可以控制此脚本,则可以在顶部添加 shebang 行,如下所示:
#!/bin/bash -x
调试代码的特定部分
或者,您可以在脚本中需要更详细信息的部分执行此操作:
line1 line2 set -x line3 line4 set +x line5
答案2
我猜您无法更改测试记录日志文件的方式。
但我可以建议两种方法:
如果你真的想要一个 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
请注意,我先进行移动,然后复制文件,因为如果您要在不同的文件系统之间移动文件,则必须先复制然后删除。这意味着您可能会遇到文件在移动时被测试覆盖的情况。
使用 T 恤
如果您知道问题何时会发生,那么您可以这样做
tail -f logfile |tee newlog
这将向粗略的日志文件显示,同时写入新的日志文件。
更改测试创建日志文件的方式以执行日志文件轮换。