如何在指定的时间间隔内跟踪(tail -f)文件(或类似文件)?

3
我正在为我们的系统添加一些nagios警报,其中一些将监视某些事件在nginx / apache日志中的发生率(或从这些日志解析值)。到目前为止,我处理这个问题的方式是使用简单的shell脚本tail -f'ing将日志记录25秒左右到临时文件中,然后杀死进程,并在临时文件上运行awk等。这里的目标是获取25秒的日志“样本”,然后进行分析。
显然,这不是最理想的,因为由于这些临时文件而增加了磁盘IO——我真正想要的是一个“增强”的tail -f,它会在一定数量的秒数后清除管道。也就是说:
tail -f --interval '5 seconds' | grep "/serve"
将在5秒内跟踪日志并显示所有具有“/serve”的行。
我想象我可以很快地编写一个ruby脚本来完成这个工作,但我想确保没有更unixy的方法来完成这个工作。从高层次上讲,有没有更好的方法来取样过去N秒的日志(不,我不想解析时间戳等)?
4个回答

5

找到了解决方案。"apt-get install timeout" :)

编辑:实际上这会终止tail,而不是使其正常退出,因此我们失去了整个管道。我想要的效果是:

timeout -15 5 tail -f /mnt/log/nginx/nginx-access.log | grep '/javascripts' | wc -l

告诉我在过去的5秒钟内提供了多少javascript文件等。


timeout -s15 5 tail -f /mnt/log/nginx/nginx-access.log | grep '/javascripts' | wc -l - diyism
当我运行它时,只会得到“终止”而没有来自wc的输出 - 有什么想法吗? - Roman Gaufman

1

稍微不同的方法:

(tail -f /var/log/messages & P=$! ; sleep 5; kill -9 $P) | grep /serve

0

GNU的tail有一个--pid标志,可用于此操作(tail将在不再存在具有该PID的进程时退出)。只需在后台启动一个sleep进程,并告诉tail在其退出时也退出。像这样:

sleep 5 & tail --pid=$! -f /var/log/system.log

tail 在时间到期时将以 0 退出。


0

我认为,作为一个Nagiios用户,您不希望探测进程因任意时间而暂停。在最坏的情况下,这会使Nagios检查其他事物的频率降低,或者“聚集”检查。

那么,使用一个快速运行(即时)并解析文件的最后几行的脚本呢?它只返回比给定时间晚的有趣的内容和时间戳。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接