tail -f 失效的情況分析

1.1 tail -f失效情況的重現

我們使用tail -f tmp.test對tmp.test文件進行動態追蹤,輸出如下:

輸入圖片說明

然後我們再開一個新的shell終端,然後用vim打開tmp.test並將文件內容修改爲:

輸入圖片說明

保存退出後,我們再切換回原來的終端,發現tail命令失效,並沒有輸出新的內容"hello2":

輸入圖片說明

發生上述情況的原因是:vim是將原來的文件刪除後,然後再生成一個新的文件,而tail -f命令是根據文件的inode來追蹤文件的,vim把原來的文件刪除,新生成的同名文件的inode已經發生了變化,所以導致tail -f命令失效。

我們來驗證一下我們上述的結論:

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

     ls -i tmp.test
    

    輸出: 輸入圖片說明

    我們可以看到inode的值是278578

  2. 使用vim對tmp.test進行修改

     vim tmp.test
    

    輸出: 輸入圖片說明

  3. 我們再次查看inode的值

     ls -i tmp.test
    

    輸出: 輸入圖片說明

    我們看到經過vim的修改後,現在新的文件inode變成了256162,至此,證明了vim會刪除原有的文件,並生成新的同名文件。

  4. 驗證echo命令是否會影響inode

     echo "hello3" >> tmp.test
    

    再次運行:

     ls -i tmp.test 
    

    輸出: 輸入圖片說明

    我們發現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在文件恢復訪問後可以重新對文件實施跟蹤。

出處:https://my.oschina.net/cloes/blog/1789231

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章