Linux

tail -f 沒有尾巴?

  • April 28, 2015

Solaris 中是否有一個命令來讀取文件,並且當它到達末尾時以 tail 的方式流式傳輸?我需要從頭開始讀取文件,它是一個二進製文件。

將不勝感激有關 Solaris 和 Linux 的資訊。

tail -9999f會做一些接近你想要的事情。如果您的文件更大,請添加更多 9。

問題:

  1. 二進製文件可能沒有換行符。 tail -f在列印任何內容之前將等待換行符。
  2. Solaris 上的版本tail(您沒有提到哪個Solaris,但可能沒關係)可能不支持該選項。它可能支持tail -n 9999 -f. 您可能需要獲取 GNU 版本的 tail。
  3. 由於文件不斷增長,因此在找出文件大小和啟動尾部程序之間存在競爭條件。如果您不要求它獲得足夠的行數,您可能會錯過文件的開頭。
  4. tail不知道您何時真正完成了對文件的寫入,因此您的gzip過程也永遠不會完成。我不確定當你ctrl-c結束tail程序時會發生什麼,但 gzip 很可能會自行清理並刪除它正在處理的文件。

我的建議是啟動您的原始程序並將輸出通過管道傳輸到 gzip,如下所示:

./my_program | gunzip > new_file.txt

這樣,gunzip 會在執行my_program緩慢時等待,但在完成指示文件的真正結尾時仍會完成my_program

您可能需要重寫程序以寫入 STDOUT 而不是直接寫入文件。

編輯:

查看手冊頁後,可以解決上述三個問題。使用-c <bytes>選項而不是-n <lines>緩解問題 1. 使用-n +0-c +0緩解問題 3.--pid=<PID>當原始程序(執行方式)終止時,使用將使 tail 終止,<PID>從而緩解問題 4。

引用自:https://serverfault.com/questions/347672