「tail -f」和「tail -F」有什麼不同?

「tail -f」和「tail -F」有什麼不同?

我從來沒有使用過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/messageslogrotate 將日誌旋轉到/var/log/messages.1. tail with-f仍會監聽指向的舊索引節點messages.1。 tail with-F會意識到這一點並讀取新的 inode。

相關內容