我正在使用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
答案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