“tail -f”和“tail -F”有什么区别?

Dae*_*ung 50 tail

我从不使用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
Run Code Online (Sandbox Code Playgroud)

很容易理解lower-f做什么,但我不遵循大写-F试图做什么。我很感激有人可以向我解释这些差异。

Kus*_*nda 88

您描述了 GNUtail实用程序。这两个标志之间的区别在于,如果我打开一个文件,例如一个日志文件,如下所示:

$ tail -f /var/log/messages
Run Code Online (Sandbox Code Playgroud)

...如果我机器上的日志轮换工具决定在我查看写入其中的消息时轮换该日志文件(“轮换”意味着删除或移动到另一个位置等),我看到的输出将只是停止。

如果我tail像这样打开文件:

$ tail -F /var/log/messages
Run Code Online (Sandbox Code Playgroud)

...再次,文件被旋转,输出将继续在我的控制台中流动,因为tail一旦文件再次可用就会重新打开文件,即当写入日志的程序开始写入新的 /var/log/messages.

在免费的 BSD 系统上,没有-F选项,但tail -f会像tail -F在 GNU 系统上一样运行,不同之处在于您收到消息

tail: file has been replaced, reopening.
Run Code Online (Sandbox Code Playgroud)

在您监视的文件消失并重新出现时的输出中。


你可以测试这个

在一个 shell 会话中,执行

$ cat >myfile
Run Code Online (Sandbox Code Playgroud)

现在将等待您输入内容。继续输入一些胡言乱语,几行。它将全部保存到文件中myfile

另一个shell 会话中(可能在另一个终端中,而不中断cat):

$ tail -f myfile
Run Code Online (Sandbox Code Playgroud)

这将myfile在控制台中显示(结束)的内容。如果您返回到第一个 shell 会话并键入更多内容,该输出将立即显示tail在第二个 shell 会话中。

现在退出cat按下Ctrl+D,并删除myfile文件:

$ rm myfile
Run Code Online (Sandbox Code Playgroud)

然后再次运行 cat:

$ cat >myfile
Run Code Online (Sandbox Code Playgroud)

...然后输入一些东西,几行。

使用 GNU tail,这些行将不会出现在第二个 shell 会话中(tail -f仍在运行的地方)。

重复练习tail -F并观察差异。


nsg*_*nsg 16

简而言之,当您打开文件时,您将获得包含文件在磁盘上确切位置的一些元数据的 inode。然后 Tail 将侦听对该文件的更改。

如果您删除文件,并创建一个具有相同名称的新文件,则文件名将相同,但它是不同的 inode(并且可能存储在磁盘上的不同位置)。tail -f填充不重试并加载新的 inode,tail -F将检测到这一点。

如果您重命名/移动文件,也会发生同样的效果。例如,如果您遵循/var/log/messages并 logrotate 将日志旋转到/var/log/messages.1. tail with-f仍将侦听指向 的旧 inode messages.1。tail with-F将意识到这一点并读取新的 inode。