我进退两难。我需要使用bash脚本检查日志文件。该脚本需要运行每5-10分钟(设置在crontab),并发送电子邮件,如果有警告或错误的日志。但是它必须只检查上次检查后添加的行,而不是一遍又一遍地检查整个文档。我不知道如何只检查上次检查后添加的行,或者在最后10分钟中添加的行在我的情况下无法工作,因为脚本不应该一直运行,应该每5-10分钟运行一次
发布于 2017-07-19 15:25:45
如果文件不太大,可以尝试将日志文件的前几行存储在环境变量中,并将其与当前行号进行比较。类似于以下脚本的内容应该可以工作:
#!/bin/bash
#here, detect_errors is a placeholder name for the function you already developped
#we use only the lines we haven't seen yet in our detect_errors function
detect_errors "$(head -n $(($(wc -l log.file) - OLD_LINE_COUNT)) log.file)"
#we update the new value for the $OLD_LINE_COUNT
export OLD_LINE_COUNT="$(wc -l log.file)"
详细解释
head -n X myfile
:显示myfile
的前X行$(( ... ))
:bash
中的算术计算wc -l log.file
:我们文件的行数$OLD_LINE_COUNT
:环境变量,存储上一次迭代的行数(第一次启动脚本时等于0)如果文件不变,$(wc -l log.file) - OLD_LINE_COUNT
将返回0,head -n 0
返回空。
如果日志文件太大,wc -l
将花费大量时间,因此在这种情况下,我的方法不会被重新使用。
编辑:,我还没有问您的日志文件是如何递增的。如果在文件末尾添加了附加行,则应该使用tail -n
而不是head -n
。
https://stackoverflow.com/questions/45194296
复制相似问题