tail

Easter79
• 阅读 593

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在文件恢复访问后可以重新对文件实施跟踪。

点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
Vue+Flask实现简单的登录验证跳转
文件位置:!输入图片说明(https://static.oschina.net/uploads/img/201711/27171542_g7Yr.png"在这里输入图片标题")login.html<!DOCTYPEhtml<htmllang"en"<head<metacharset
Stella981 Stella981
3年前
Fiddle设置iphone抓包
_注意:保证手机和电脑在一个网络上_一,设置Fiddler!输入图片说明(https://static.oschina.net/uploads/img/201707/27100350_ckfa.png"在这里输入图片标题")!输入图片说明(https://static.oschina.net/uploads/img/201707
Stella981 Stella981
3年前
Intellij idea或者Android Studio实用Live_Templates好用模板整理
Live\_Templates的作用是自动补全代码:自定义补全代码:单例模式:sin!输入图片说明(https://static.oschina.net/uploads/img/201707/17114328_kR84.png"在这里输入图片标题")Templatetext:privatestatic
Wesley13 Wesley13
3年前
#H5#WebStorm的警告
!输入图片说明(https://static.oschina.net/uploads/img/201611/05163209_Lj0x.png"在这里输入图片标题")今天写了个小时的HTML代码,WS提示forminputwithoutanassociatedlabelortitleattribute,然后搜索了下看到百度知道的一个
Stella981 Stella981
3年前
Canvas
Canvas04柱状图!输入图片说明(https://static.oschina.net/uploads/img/201707/04223024_wxwr.png"在这里输入图片标题")代码如下:<!DOCTYPEhtml<htmllang"zhCN"<head<metacharset"UTF8"<met
Wesley13 Wesley13
3年前
PHP中的依赖注入(DI)容器
!输入图片说明(https://static.oschina.net/uploads/img/201806/03164821_lowC.png"在这里输入图片标题")介绍我们已经介绍过了PHP反射API(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fphpcast
Stella981 Stella981
3年前
Elasticsearch学习总结八 ElasticSearch中的聚合操作
首先准备数据,索引包含四个字段fieldA,fieldB,fieldC,fieldD,如下图,以下案列中都使用了基本REST命令和JavaAP两种方式实现!输入图片说明(https://static.oschina.net/uploads/img/201706/15212621_M2dc.png"在这里输入图片标题")1).首先按照某
Wesley13 Wesley13
3年前
PHP 与 GO
PHP!输入图片说明(https://static.oschina.net/uploads/img/201608/22112754_GEtW.png"在这里输入图片标题")输出json!输入图片说明(https://static.oschina.net/uploads/img/201608/22112825_n
Stella981 Stella981
3年前
Delivery Pipeline
deliverypipeline!输入图片说明(https://static.oschina.net/uploads/img/201702/04110334_cl3u.png"在这里输入图片标题")下面这个是netflix的部署流程:!输入图片说明(https://static.oschina.net/uploads/img/2017
Wesley13 Wesley13
3年前
JDK和Spring中SPI的实现原理和区别
SPI简介serviceproviderinterfaceJDK内置的中服务发现机制一种动态替换发现的机制!输入图片说明(https://static.oschina.net/uploads/img/201804/04141503_Xd94.png"在这里输入图片标题")此图使用(https://www.jianshu
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k