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

Bash 如何使用tail实用程序查看经常重新创建的日志文件,bash,file,tail,Bash,File,Tail,我需要一个解决方案,创建一个脚本来跟踪日志文件,该文件在达到一定大小后重新创建(使用相同的名称) 使用“tail-f”会在重新创建/旋转文件时停止拖尾 我想做的是创建一个脚本,该脚本将跟踪文件,例如,在文件到达100行之后,然后重新启动命令。。。或者最好在重新创建文件时重新启动命令 可能吗?试着运行 watch "tail -f" yourfile.log 对!!使用此选项(当文件不存在或无法访问时,重试将使尾部重试,而不仅仅是失败-例如更改文件时): 或 tail-F 由于您没有支持所有功能

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

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

我想做的是创建一个脚本,该脚本将跟踪文件,例如,在文件到达100行之后,然后重新启动命令。。。或者最好在重新创建文件时重新启动命令

可能吗?

试着运行

watch "tail -f" yourfile.log
对!!使用此选项(当文件不存在或无法访问时,重试将使尾部重试,而不仅仅是失败-例如更改文件时):

tail-F

由于您没有支持所有功能的尾部,并且由于您没有watch,您可以使用一个简单的脚本无限期地循环执行尾部

#!/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干净地退出此脚本。这取决于你

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


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

如果tail-F不可用,并且您正在尝试从logrotate恢复,您可以将
copyruncate
选项添加到
logrotate.d/
spec文件中,这样在每次旋转后都不会创建新文件,而是保留并截断文件,同时将副本旋转出去

这样,旧文件句柄将继续指向新的
(被截断)
日志文件,新日志将附加到该文件中


请注意,在此
复制截断过程中可能会丢失一些数据。

~>tail-f--follow=name--retry/logs/logs/log.log tail:无法打开输入。看起来您在其中有两次
/logs
。这是故意的吗?如果该文件不存在或您没有权限,则会出现错误。但是,使用
--retry
它将继续尝试,直到文件存在或您有权访问它。首先用当前目录中的测试文件进行测试。是的,这是有意的。这是存储我的日志的目录。不幸的是,这个版本的tail不支持-F或--follow=name。我正在尝试用脚本找到另一种方法。OS X tail不支持
--retry
选项。在macOS上,您可以轻松地安装和使用GNU版本的
tail
。安装时使用:
brew安装coreutils
。与一起使用:
gtail-f--follow=name--retry
(gnu UTIL的前缀为
g
,以避免与macOS核心工具冲突)。我正在运行的系统上无法使用watch
tail --follow=name --retry
tail -F <filename>
#!/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