文件截断时 tail -f 中断

文件截断时 tail -f 中断

我正在使用tail -f(在 Mac OS X el Capitan 上的终端中)查看文件的实时更改(使用 PERL 脚本从数据库中提取数据的结果)。然而,有时,Perl 脚本会截断文件并向其中添加新数据。有时,当发生这种情况时,它会给我这样的信息:

tail: test.txt: file truncated

然后不显示文件的任何内容。这似乎只发生在我用比以前更少的行替换文件时。当新行比运行脚本之前长时,我不会收到此错误并且tail -f会继续工作。我已经确认,事实上,文件中的数据tail -f在收到此(错误?)消息后未显示。

我见过这个类似的问题:使用 tail 时抑制“文件截断”消息

tail -f test.txt 2> /dev/null

但这只是抑制了消息并且仍然中断,它不会继续向我显示较短的、被截断的文件内容。

有没有更好的命令可用于实时查看文件更改?或者是否有标志来tail -f在文件被截断时不予理会?

答案1

正如其他人指出的那样,tailOS X 附带的命令没有该--retry选项。但是,您可以简单地安装具有该选项的 GNU 版本的 tail;它是的一部分GNU 核心工具。例如,如果您使用 MacPorts,您可以通过运行 来安装它们sudo port install coreutils

实时观看文件的替代方法是命令watch,不幸的是,OS X 也没有提供该命令。但是,您可以使用这个简单的解决方法

答案2

这是一个tail-F脚本。它需要一个参数 - 尾部文件。可能有更好的选择(例如安装 GNU tail),但它是为了证明简单版本的工具通常可以从可用的部分构建。

#!/bin/bash
#
file="$1"
size=$(stat -c '%s' "$file" 2>/dev/null)
test -z "$size" && echo "No file '$file'" >&2

while sleep 1
do
    n_size=$(stat -c '%s' "$file" 2>/dev/null)

    if [[ -n "$n_size" ]]
    then
        if [[ 0 == "$size" ]]
        then
            # Output whole file (so far)
            dd bs=1K if="$file" 2>/dev/null
            size="$n_size"

        elif [[ "$n_size" > "${size:-0}" ]]
        then
            # Output new part of file
            dd bs="$size" skip=1 if="$file" 2>/dev/null
            size="$n_size"

        elif [[ -z "$size" ]]
        then
            echo "New file '$file'" >&2
            size=0

        elif [[ "$n_size" < "${size:-0}" ]]
        then
            echo "Rewinding file '$file'" >&2
            size=0
        fi
    fi
done

答案3

使用tail --f=name

-f该标志的默认值为descriptor。将其更改为名称,tail将跟随文件名,即使文件被截断也会继续显示。

附言。您仍然会收到该消息tail: File truncated

答案4

即使文件被删除或无法访问,以下命令也会不断重试该文件。创建后它会再次打印内容。

tail -F filename --retry

相关内容