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