如何使用tail实用程序查看经常重新创建的日志文件

时间:2011-07-26 09:43:09

标签: bash file tail

我需要一个创建脚本的解决方案,以便在达到特定大小后重新创建(使用相同名称)的日志文件。

使用“tail -f”会导致在重新创建/旋转文件时停止拖尾。

我想要做的是创建一个脚本来拖尾文件,然后在它达到100行之后,然后重新启动命令......或者甚至更好地在重新创建文件时重新启动命令?

有可能吗?

4 个答案:

答案 0 :(得分:20)

是的!使用此方法(当文件不存在或无法访问时,重试将进行尾部重试,而不仅仅是失败 - 例如,当您更改文件时):

tail -f --retry <filename>

OR

tail --follow=name --retry

OR

tail -F <filename>

答案 1 :(得分:2)

尝试运行

watch "tail -f" yourfile.log

答案 2 :(得分:2)

如果尾部-F 可用,并且您尝试从 logrotate 恢复,则可以将copytruncate选项添加到logrotate.d/因此,不是每次旋转后都创建一个新文件,而是保留并截断文件,同时旋转出一个副本。

这样,旧文件句柄继续指向新的(truncated)日志文件,其中附加了新日志。

请注意,此copy-truncate进程可能会丢失一些数据。

答案 3 :(得分:0)

由于你没有支持所有功能的尾部,并且因为你没有看,你可以使用一个无限循环的简单脚本来执行尾部。

#!/bin/bash 

PID=`mktemp`
while true;
do
  [ -e "$1" ] && IO=`stat -c %i "$1"`
  [ -e "$1" ] && echo "restarting tail" && { tail -f "$1" 2> /dev/null & echo $! > $PID; }

  # as long as the file exists and the inode number did not change
  while [[ -e "$1" ]] && [[ $IO = `stat -c %i "$1"` ]]
  do
     sleep 0.5
  done
  [ ! -z $PID ] && kill `cat $PID` 2> /dev/null && echo > $PID
  sleep 0.5
done 2> /dev/null
rm -rf $PID

您可能希望使用trap来干净地退出此脚本。这取决于你。

Basicaly,此脚本检查inode编号(使用stat -c %i "$1")是否更改为终止tail命令并在重新创建文件时启动新命令。

注意:你可能会摆脱会污染输出的echo "restarting tail"。它只对测试有用。如果在我们检查inode编号之后和开始尾部处理之前替换文件,也可能会出现问题。