我需要创建一个脚本,可以跟踪一个日志文件的变化,当该文件达到一定大小后重新创建(文件名相同)。
使用“tail -f
”会在文件被重新创建/轮换时停止跟踪。
我想创建一个脚本,它可以尾随文件,并在文件达到100行时重新启动命令……或者更好的是,在文件重新创建时重新启动命令?
这个可行吗?
是的!使用此代码(retry 会在文件不存在或因其他原因无法访问时进行尾部重试,而不是直接失败 - 可能是当你正在更改文件时):
tail -f --retry <filename>
或者
tail --follow=name --retry
或者
tail -F <filename>
尝试运行
watch "tail -f" yourfile.log
由于您没有支持所有功能的尾部,并且因为您没有手表,您可以使用一个简单的脚本无限循环执行尾部。
#!/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进程之前替换了文件,则可能会出现问题。
/logs
。这是有意为之吗?如果该文件不存在或您没有权限,则会出现错误。但是,使用--retry
选项,它将不断尝试,直到文件存在或您对其具有权限为止。首先在当前目录中使用测试文件进行尝试。 - evantail
。 安装命令为:brew install coreutils
。使用命令为:gtail -f --follow=name --retry <filename>
(GNU 工具前缀为g
,以避免与 macOS 核心工具冲突)。 - fiedl