我從來沒有使用過tail -F
命令,而是總是使用,tail -f
但是有人告訴我,這-F
更好,沒有太多解釋。
我查找了 tail 指令的手冊頁。
-f output appended data as the file grows;
-F Same as --follow=name --retry
--retry Keep trying to open a file even when it is or becomes inaccessible
很容易理解 lower 的-f
作用,但我不明白 upper case-F
試圖做什麼。我很感激有人能向我解釋這些差異。
答案1
您描述了 GNUtail
實用程式。這兩個標誌之間的區別在於,如果我打開一個文件,例如日誌文件,如下所示:
$ tail -f /var/log/messages
....如果我的機器上的日誌輪換設施決定輪換該日誌文件,而我正在觀察寫入該日誌文件的消息(“輪換”意味著刪除或移動到另一個位置等),我看到的輸出將只是停止。
tail
如果我用這樣的方式開啟文件:
$ tail -F /var/log/messages
……再次,檔案被旋轉,輸出將繼續在我的控制台中流動,因為tail
一旦檔案再次可用,即當寫入日誌的程式開始寫入新的 /var/log/messages
。
在免費的 BSD 系統上,沒有-F
選項,但tail -f
其行為與 GNU 系統上的行為類似tail -F
,不同之處在於您會收到訊息
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:
$ cat >myfile
....然後輸入一些內容,幾行。
使用 GNU tail
,這些行將不是顯示在第二個 shell 會話中(tail -f
仍在運行)。
重複練習tail -F
並觀察差異。
答案2
簡單來說,當您開啟檔案時,您將獲得包含一些元資料的索引節點,這些資料表明該檔案在磁碟上的確切位置。然後 Tail 將監聽該檔案的變更。
如果刪除該文件,並建立具有相同名稱的新文件,文件名稱將相同,但它是不同的索引節點(並且可能儲存在磁碟上的不同位置)。tail -f
填充不重試並載入新的索引節點,tail -F
將檢測到這一點。
如果您重新命名/移動文件,也會發生相同的效果。例如,如果您遵循/var/log/messages
logrotate 將日誌旋轉到/var/log/messages.1
. tail with-f
仍會監聽指向的舊索引節點messages.1
。 tail with-F
會意識到這一點並讀取新的 inode。