我从来没有使用过tail -F
命令,而是总是使用命令tail -f
,但是有人告诉我这-F
更好,没有太多解释。
我查找了 tail 命令的手册页。
-f output appended data as the file grows;
-F Same as --follow=name --retry
--retry Keep trying to open a file even when it is or becomes inaccessible
很容易理解 lower 的-f
作用,但我不明白 upper case-F
试图做什么。我很感激有人能向我解释这些差异。
答案1
您描述了 GNUtail
实用程序。这两个标志之间的区别在于,如果我打开一个文件(例如日志文件),如下所示:
$ tail -f /var/log/messages
...如果我的机器上的日志轮换设施决定在我观察写入消息时轮换该日志文件(“轮换”意味着删除或移动到另一个位置等),我看到的输出将只是停止。
tail
如果我用这样的方式打开文件:
$ tail -F /var/log/messages
...再次,文件被旋转,输出将继续在我的控制台中流动,因为tail
一旦文件再次可用,即当写入日志的程序开始写入新的 /var/log/messages
。
在免费的 BSD 系统上,没有-F
选项,但tail -f
其行为与 GNU 系统上的行为类似tail -F
,不同之处在于您会收到消息
tail: file has been replaced, reopening.
当您正在监视的文件消失并重新出现时,在输出中。
你可以测试一下
在一个 shell 会话中,执行
$ cat >myfile
现在将等待您输入内容。继续输入一些乱码,几行。它将全部保存到文件中myfile
。
在其他shell 会话(可能在另一个终端中,不中断cat
):
$ tail -f myfile
myfile
这将在控制台中显示 的(结尾)内容。如果您返回第一个 shell 会话并输入更多内容,则该输出将立即显示tail
在第二个 shell 会话中。
现在cat
按 退出Ctrl+D,然后消除文件myfile
:
$ rm myfile
然后再次运行cat:
$ cat >myfile
...然后输入一些内容,几行。
使用 GNU tail
,这些行将不是显示在第二个 shell 会话中(tail -f
仍在运行)。
重复练习tail -F
并观察差异。
答案2
简单来说,当您打开文件时,您将获得包含一些元数据的索引节点,这些元数据表明该文件在磁盘上的确切位置。然后 Tail 将监听该文件的更改。
如果删除该文件,并创建一个具有相同名称的新文件,文件名将相同,但它是不同的索引节点(并且可能存储在磁盘上的不同位置)。tail -f
填充不重试并加载新的索引节点,tail -F
将检测到这一点。
如果您重命名/移动文件,也会发生相同的效果。例如,如果您遵循/var/log/messages
logrotate 将日志旋转到/var/log/messages.1
. tail with-f
仍会监听指向的旧索引节点messages.1
。 tail with-F
会意识到这一点并读取新的 inode。