1.1 tail -f失效情況的重現
我們使用tail -f tmp.test
對tmp.test文件進行動態追蹤,輸出如下:
然後我們再開一個新的shell終端,然後用vim打開tmp.test並將文件內容修改爲:
保存退出後,我們再切換回原來的終端,發現tail命令失效,並沒有輸出新的內容"hello2":
發生上述情況的原因是:vim是將原來的文件刪除後,然後再生成一個新的文件,而tail -f
命令是根據文件的inode來追蹤文件的,vim把原來的文件刪除,新生成的同名文件的inode已經發生了變化,所以導致tail -f
命令失效。
我們來驗證一下我們上述的結論:
-
查看tmp.test的文件的inode
ls -i tmp.test
輸出:
我們可以看到inode的值是278578
-
使用vim對tmp.test進行修改
vim tmp.test
輸出:
-
我們再次查看inode的值
ls -i tmp.test
輸出:
我們看到經過vim的修改後,現在新的文件inode變成了256162,至此,證明了vim會刪除原有的文件,並生成新的同名文件。
-
驗證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