tail 4年前

人工智能
631
tail

1.1 tail -f失效情况的重现

我们使用tail -f tmp.test对tmp.test文件进行动态追踪,输出如下:

tail

然后我们再开一个新的shell终端,然后用vim打开tmp.test并将文件内容修改为:

tail

保存退出后,我们再切换回原来的终端,发现tail命令失效,并没有输出新的内容"hello2":

tail

发生上述情况的原因是:vim是将原来的文件删除后,然后再生成一个新的文件,而tail -f命令是根据文件的inode来追踪文件的,vim把原来的文件删除,新生成的同名文件的inode已经发生了变化,所以导致tail -f命令失效。

我们来验证一下我们上述的结论:

  1. 查看tmp.test的文件的inode

    ls -i tmp.test
    

    输出: tail

    我们可以看到inode的值是278578

  2. 使用vim对tmp.test进行修改

    vim tmp.test
    

    输出: tail

  3. 我们再次查看inode的值

    ls -i tmp.test
    

    输出: tail

    我们看到经过vim的修改后,现在新的文件inode变成了256162,至此,证明了vim会删除原有的文件,并生成新的同名文件。

  4. 验证echo命令是否会影响inode

    echo "hello3" >> tmp.test
    

    再次运行:

    ls -i tmp.test
    

    输出: tail

    我们发现inode没有发生改变,这也解释了:为什么vim修改文件让tail -f命令失效,而使用echo "hello3" >> tmp.test不会令tail -f命令失效。

结论:tail -f通过inode追踪文件,如果文件的inode发生了变化,将会使tail -f失效。

1.2 解决方案

使用tail -F替代tail -f,根据man tail的说明,tail -F在文件不可以打开的时候,会重试打开该文件,也就是在vim删除旧文件,创建新文件的过程中,tail短暂性失去了对tmp.test文件的访问权限,加上-F选项后,tail在文件恢复访问后可以重新对文件实施跟踪。

琳婧cRYs
所有的漩涡与波浪都痛苦而急切地奔向自己的目标——许许多多不同的目标:奔向瀑布,奔向大海,奔向河流,直至百川汇集的大洋。
3
发布数
2
关注者
7349
累计阅读

热门教程文档

C#
57小节
MyBatis
19小节
10.x
88小节
Vue
25小节
Java
12小节
广告