Answers:
您描述了GNU tail
实用程序。这两个标志之间的区别在于,如果我打开一个文件,例如一个日志文件,如下所示:
$ tail -f /var/log/messages
...并且如果我的机器上的日志轮转工具决定在我看着正在写入消息的日志文件时轮换该日志文件(“轮换”表示删除或移动到其他位置等),我看到的输出将停。
如果我这样打开文件tail
:
$ tail -F /var/log/messages
...再次旋转文件,输出将继续在我的控制台中流动,因为tail
一旦文件再次可用,即当写入日志的程序开始写入new 时,它将重新打开文件/var/log/messages
。
在免费的BSD系统上,没有任何-F
选择,但其tail -f
行为与tail -F
GNU系统上的行为相同,不同之处在于您得到了消息
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 >myfile
...然后输入几行内容。
使用GNU时tail
,这些行将不会在第二个Shell会话中显示(tail -f
仍在运行)。
重复练习,tail -F
观察差异。
tail -f foo.log
并且系统移至foo.log
例如foo.log.0.gz
输出,您将看到停止。-F
另一方面,如果使用,则可以看到新 内容,foo.log
而中间没有任何中断。
简化后,当您打开文件时,您将获得inode,其中包含一些有关文件在磁盘上确切位置的元数据。然后,Tail将侦听对该文件的更改。
如果删除文件,然后使用相同的名称创建一个新文件,则文件名将相同,但是它是一个不同的inode(可能存储在磁盘上的其他位置)。tail -f
填充不重试并加载新的inode,tail -F
将检测到这一点。
如果重命名/移动文件,将会发生相同的效果。例如,如果您跟随/var/log/messages
并且logrotate将日志旋转到/var/log/messages.1
。尾巴-f
仍会听指向的旧索引节点messages.1
。tail with -F
将意识到这一点并读取新的inode。